从facebook令牌到jwt令牌

时间:2015-11-16 16:00:35

标签: angularjs facebook express mongoose passport.js

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

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

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

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

这是如何运作的?

我的前端是棱角分明的,我的API是用nodejs,express&猫鼬。

护照代码:

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);
        });
    }
));

generatejwt代码:

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 个答案:

答案 0 :(得分:0)

您需要创建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);

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

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
              });
  };