从 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章
在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌