我需要在我的 node.js 应用程序上构建一个基于令牌的身份验证,用户可以使用他的 facebook 或 twitter 凭据登录我的应用程序,并使用访问令牌来获取资源。这篇文章建议一旦通过 facebook 或 twitter 或其他方式进行身份验证,就在每个请求上使用访问令牌,并且根本不需要 Session 例如
获取 /api/v1/somefunction?token='abcedf'
- 客户端从响应中获取访问令牌。
- 客户端使用 token 参数调用一些服务器 api。
所以下面的代码,是通过twitter授权用户,如果我的应用没有找到我的用户信息,则将用户信息存储到数据库中。
passport.use(new TwitterStrategy({
consumerKey: config.twitter.clientID,
consumerSecret: config.twitter.clientSecret,
callbackURL: config.twitter.callbackURL
},
function(token, tokenSecret, profile, done) {
console.log('TwitterStrategy /auth/twitter.............',profile.id, profile.displayName, profile.username, profile.emails[0], profile._json.avatar_url);
userModel.findUserByQuery({ 'social.twitter.id': profile.id }, function (err, user) {
if (!user) {
console.log('twitter user not found'.red);
userModel.createNewUser( { username:profile.username,
email:profile.emails[0].value,
img:profile._json.avatar_url,
fullname:profile.displayName,
password:profile._json.avatar_url,
social:{twitter:{id:profile.id,avatar:profile._json.avatar_url, name:profile.username,token:accessToken} }},
function(err,data){
if(err) return done(err);
else if(!data) return done(null, false, { message: 'can not create your profile in database' });
else {
console.log('save the new twitter user into database'.green, data._id);
return done(err, user);
}
})
} else {
console.log('twitter user found'.green);
return done(err, user);
}
})
}
))
不过,我有两个问题,
1.如何将访问令牌发送给客户端以进行以下请求
在代码中,在通过 twitter 进行身份验证后,我获取访问令牌并将此令牌发送到浏览器上的客户端,因为令牌嵌入在 url 参数中,所以我尝试了代码 res.redirect ('/users/profile ? token = blabla '),但在客户端浏览器中,url 仍显示为 '/users/profile' 而不是 '/users/profile ? 令牌=blabla'
2.一旦从 twitter 进行身份验证,带有令牌的以下请求正在本地通过我的应用程序(我将令牌存储在数据库中,并比较以下令牌进行验证)还是仍然到 twitter API 进行身份验证?
如果在第一种情况下,那么我应该将令牌存储到数据库中,以便在对我的应用程序的以下请求中比较令牌中的以下请求?那正确吗