React-Facebook-Login 和 Node.js Express
Posted
技术标签:
【中文标题】React-Facebook-Login 和 Node.js Express【英文标题】:React-Facebook-Login and Node.js Express 【发布时间】:2017-06-25 01:27:13 【问题描述】:我在客户端使用React with Redux
,在服务器上使用Node.js with Express
作为Rest API
。我已经使用passport
实现了本地登录,但我也不想实现社交登录,例如 Facebook 登录。
我正在使用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。 【参考方案1】:解决方案是通过从服务器向 https://graph.facebook.com/me 发送包含 accessToken 的 GET 请求,使用 facebook graph
验证 accessToken。
【讨论】:
以上是关于React-Facebook-Login 和 Node.js Express的主要内容,如果未能解决你的问题,请参考以下文章