我使用passportjs和passport-github在我的应用程序中创建社交登录,
passport.use(new GithubStrategy(
{
clientID : configAuth.githubAuth.clientID,
clientSecret : configAuth.githubAuth.clientSecret,
callbackURL : configAuth.githubAuth.callbackURL
},
function(token, refreshToken, profile, done) {
process.nextTick(function() {
User.findOne({'github.id' : profile.id}, function(err, user) {
if (err) {
return done(err);
}
if (user) {
return done(null, user);
} else {
var newUser = new User();
newUser.github.id = profile.id,
newUser.token = token,
newUser.name = profile.displayName;
newUser.email = profile.emails[0].value;
newUser.username = profile.username;
// save
newUser.save(function(err){
if (err) {
throw err;
}
return done(null, newUser);
});
}
});
});
}
));
现在我正在使用另一个名为octonode的组件,它需要access_token
来验证其用户,回调中的令牌与此access_token相同,因为我在执行此操作时似乎没有经过身份验证:
var github = require('octonode');
exports.read = function (req, res, next) {
var client = github.client();
client.get('/user?access_token=' + req.user.token, {}, function (err, status, body, headers) {
res.json(body);
});
};
并尝试这样做:
var client = github.client(req.user.token);
client.get('/user',{}, function...)
我得到一个空白的屏幕,这意味着没有回应。
答案 0 :(得分:4)
好的,正如SO中的一个答案所说:
请注意,除了在登录期间获取用户配置文件外,Passport不会主动使用访问令牌或刷新令牌。在应用任何必要的API请求时,您的应用程序负责使用这些令牌。因此,您可以实现您描述的任一方法,Passport不参与该过程。
access_tokens会返回给您,但是在您负责保存或执行任何操作后,它都不会处理它。
我的代码基本上受到Scotch.io的facebook auth使用护照的教程的启发。在那里,他们不会在每次登录时更新令牌,因为他们不需要在他们的教程中,但他们确实将其保存在数据库中,检查他们的source code
只有几条评论和调试,我发现这是我的应用程序的罪魁祸首,所以我需要更新条件,说明是否找到用户,更新令牌和一些值,以便一些重要的信息将坚持登录。
if (user) {
user.token = token;
user.name = profile.displayName;
user.email = profile.emails[0].value;
user.save();
return done(null, user);
}
现在这样做会很好:
var client = github.client(req.user.token);
client.get('/user', {}, function (err, status, body, headers) {
res.json(body);
});
感谢@MikeSmithDev帮助我。