繁体   English   中英

使用返回的令牌访问github API

[英]Using the returned token to access 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...)

我出现黑屏,表示没有反应。

好吧,作为SO中的一个答案指出:

请注意,Passport不会主动使用访问令牌或刷新令牌,只能在登录期间获取用户配置文件。 当需要进行任何API请求时,您负责由应用程序使用这些令牌。 这样,您可以实现您描述的任何一种方法,过程中不涉及Passport。

access_tokens返回给您,但是之后不会处理,您是负责保存它或做任何您想做的人。

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

在进行一些注释和调试的过程中,我发现这是我的应用程序中的罪魁祸首,因此我需要更新条件(指出是否已找到用户),更新令牌和一些值,以便一些重要信息在登录时仍然存在。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM