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的主要内容,如果未能解决你的问题,请参考以下文章

从移动浏览器登录 Facebook 时出错

AttributeError:“NoneType”对象没有“保存”属性

英语中not和no的差别都有哪些

634. yes 和 no

no one与none的区别

Arduino - NO_KEY 是啥意思和做啥?