我在客户端上使用React with Redux
,在服务器上使用Node.js with Express
作为Rest API
。我已经实施了本地登录passport
,但我也不想实现社交登录,例如Facebook登录。React-Facebook-Login和Node.js Express
我正在使用react-facebook-login
用户获得身份验证,并在响应中返回一些信息,包括AccessToken,电子邮件,名称,ID等。然后,我想将这些信息发送到服务器(在另一个端口上运行)并将用户保存到数据库(MongoDb)。这是用户模式是如何构成的:
const userSchema = Schema({
local: {
email: {
type: String,
unique: true,
},
password: String,
name: String
},
facebook: {
id: String,
token: String,
email: String,
name: String
},
...
在用户已经保存到数据库中,我返回JWTtoken给客户使用此项功能:
const tokenForUser = (user) => {
const timestamp = new Date().getTime();
return jwt.encode({ sub: user._id, iat: timestamp }, SECRET);
};
的令牌可以用来认证。
好的,这是真正的问题。当创建一个Facebook的用户首先检查该用户是否存在,如果没有则创建他:
const facebookSignIn = (model, cb) => {
User.findOne({ 'facebook.id': model.id }, (err, docs) => {
if (err) {
return cb({ 'status': HTTP_INTERNAL_SERVER_ERROR,
'message': { error: 'Unable to search for an user due to an unknown error' } });
} else if (docs) {
return cb(null, { token: tokenForUser(docs) });
}
const user = new User({
facebook: {
id: model.id,
token: model.accessToken,
email: model.email,
name: model.name
}
});
user.save((err) => {
if (err) {
if (err.name === VALIDATION_ERROR) {
return cb({ 'status': HTTP_PRECONDITION_FAILED,
'message': { error: Object.keys(err.errors).map(e => `${err.errors[e].message} `) } });
}
return cb({ 'status': HTTP_INTERNAL_SERVER_ERROR,
'message': { error: 'Unable to save user due to an unknown error' } });
}
return cb(null, { token: tokenForUser(user) });
});
});
};
如果用户已经被认证(在数据库中存在),那么只能有包含发送到服务器的请求他/她的Facebook ID。然后用户将被允许进入该网站,并将返回一个JWTtoken。
我需要在用户在服务器上进行身份验证时从用户身份验证accessToken。如何绕过CORS来验证服务器上的accessToken?
在此先感谢!
如果用户通过身份验证,他/她需要将JWT发送到服务器,不仅仅是fb Id,如果出于某种原因需要它,jwt可以包含一个id。出于安全原因,您不应该绕过CORS。您可以在授权标题上发送JWT。 – Hosar