从 facebook 令牌到 jwt 令牌

Posted

技术标签:

【中文标题】从 facebook 令牌到 jwt 令牌【英文标题】:From facebook token to jwt token 【发布时间】:2016-02-17 19:09:49 【问题描述】:

我正在使用护照模块对用户进行身份验证并生成 jwt 令牌。

现在我想让 facebook 登录成为可能。我正处于获得 fb 令牌和 facebook id 的阶段。

我应该如何处理这些信息?目前我创建了一个新用户,该用户有一个带有 facebook id 但没有密码的变量。

没有密码我无法生成 jwt 令牌,因此我无法登录。

这是如何工作的?

我的前端是有角度的,我的 API 是用 nodejs、express 和 mongoose 编写的。

护照号码:

passport.use(new LocalStrategy(
    function(username, password, done) 
        User.findOne( username: username , function (err, user) 
            if (err)  return done(err); 
            if (!user) 
                return done(null, false,  message: 'Incorrect username.' );
            
            if (!user.validPassword(password)) 
                return done(null, false,  message: 'Incorrect password.' );
            
            return done(null, user);
        );
    
));

生成jwt代码:

UserSchema.methods.generateJWT = function() 

    // set expiration to 60 days
    var today = new Date();
    var exp = new Date(today);
    exp.setDate(today.getDate() + 60);

    return jwt.sign(
        _id: this._id,
        username: this.username,
        exp: parseInt(exp.getTime() / 1000),
    , 'SECRET');
;

【问题讨论】:

【参考方案1】:

您需要创建 2 条路线:

1) 这将被调用以登录 facebook。

2)用户认证成功的回调路由。(该回调路由需要在facebook开发者门户中注册。

//Facebook Login
app.route('/auth/facebook')
.get(passport.authenticate('facebook',  scope: 'email' ));
// Callback
app.route('/auth/facebook/callback')
.get(passport.authenticate('facebook'),users.generateJWT);

定义一个 facebook 策略,将用户详细信息(ID、令牌、电子邮件)存储在您的数据库中

var facebookStrategy = new FacebookStrategy(  
clientID: cfg.facebook.clientID,
clientSecret: cfg.facebook.clientSecret,
callbackURL: cfg.facebook.callbackURL,
profileFields: ['id', 'email', 'first_name', 'last_name']
,
function(token, refreshToken, profile, done) 
  console.log("Token: "+ token);
  console.log("RefreshToken: "+ refreshToken);
  console.log("profile: "+ profile);
  process.nextTick(function() 
   User.findOne( 'facebook.id': profile.id , function(err, user) 
    if (err)
      return done(err);
    if (user) 
        console.log("User Found");
      return done(null, user);
     else 
        console.log("Creating user");
      var newUser = new User();
      console.log("Token: "+ token);
      newUser.facebook.id = profile.id;
      newUser.facebook.token = token;
      newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
      newUser.facebook.email = (profile.emails[0].value || '').toLowerCase();

      newUser.save(function(err) 
        if (err)
          throw err;
        return done(null, newUser);
      );
    
  );
);
);

在控制器中,为回调路由编写如下代码:

/**
* Generate JWT Token 
*/
 exports.generateJWT = function(req, res) 
 var token;
             token = req.user.generateJwt();
             res.status(200);
             res.json(
                "token" : token
              );
  ; 

【讨论】:

以上是关于从 facebook 令牌到 jwt 令牌的主要内容,如果未能解决你的问题,请参考以下文章

我无法再从 facebook 获取令牌

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌

刷新令牌和 JWT 令牌交互

如何从 django rest 框架访问 jwt 令牌到 Angular 前端

单页应用程序 JWT,令牌刷新与长寿命令牌

Angularjs 和 slim 框架 JWT 身份验证和令牌刷新流程