使用返回的令牌访问github api

时间:2014-09-03 22:28:23

标签: node.js express passport.js github-api

我使用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...)

我得到一个空白的屏幕,这意味着没有回应。

1 个答案:

答案 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帮助我。