2017-02-07 86 views
0

我在客户端上使用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?

在此先感谢!

+0

如果用户通过身份验证,他/她需要将JWT发送到服务器,不仅仅是fb Id,如果出于某种原因需要它,jwt可以包含一个id。出于安全原因,您不应该绕过CORS。您可以在授权标题上发送JWT。 – Hosar

回答