【问题标题】:Using the returned token to access github api使用返回的token访问github api
【发布时间】:2014-10-28 13:29:15
【问题描述】:

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

我得到一个空白屏幕,表示没有响应。

【问题讨论】:

  • 您已经验证req.user.token 实际上是在返回令牌值?
  • 是的,它实际上是在返回一个值,一些乱码。
  • 我猜,req.user.token和github返回的token不一样。
  • 你能验证一下吗?我在存储/访问令牌的方式上采用了不同的方法,但您保存的令牌看起来是正确的。
  • 事实上,我通常会更新大多数属性,以获取用户所做的任何更新。

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


【解决方案1】:

好的,正如 SO 中的一个答案所述:

请注意,除了在登录期间获取用户配置文件之外,Passport 不会主动使用访问令牌或刷新令牌。您的应用程序负责在发出任何必要的 API 请求时使用这些令牌。因此,您可以实现您描述的任何一种方法,Passport 不参与该过程。

access_tokens 被退回给你,但它不处理它,你是负责保存它或做任何你想做的事情的人。

我的代码基本上受到 Scotch.io 的 facebook auth 中使用护照的教程的启发。他们不会在每次登录时更新令牌,因为他们不需要在他们的教程中,但他们确实将其保存在数据库中,检查他们的source code

通过几个 cmets 和调试,我发现这是我的应用程序中的罪魁祸首,因此我需要更新说明是否找到用户的条件、更新令牌和一些值,以便一些重要信息将持续登录。

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

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2021-04-29
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多