当前位置: 首页 > 知识库问答 >
问题:

GitHub的404-InternalOAuthError的Passport失败了,为什么?

涂承运
2023-03-14

我有passport与谷歌和Facebook合作。我已经尝试添加Github来添加这些凭据,这样我就可以执行经过验证的Github API调用。所以我简单地添加了使用Google或Facebook凭据登录的相同模式

但是在GitHub进行身份验证回调之后,我在代码中间看到InternalOAuthError。当最后一行“return done(null,user.userdata);”叫做。尝试调试会干扰回调。所以我希望有人能更清楚地解释一下我做错了什么。

真正奇怪的是,我已经收到了来自github的用户配置文件,并用'user.update(db)'存储在我的数据库中,就像我使用Google一样。那么当我试图通过调用done(...)返回时就会发生崩溃。

我需要在GitHub上的个人资料中添加一些内容吗?还是别的什么?或者这是因为我很早就已经使用passport使用Google凭据登录了。注意,对于Google或Facebook,我指定了session:false。我用'passport-github'和'passport-github2'都尝试了这一点。

清晰的代码是:

index.js

var express = require('express');
var passport = require('passport');
var auth = require('../auth.service');

var router = express.Router();

router
  .get('/:user', passport.authenticate('github', {
    failureRedirect: '/signup',
    session: false
  }))

  .get('/callback', passport.authenticate('github', {
    failureRedirect: '/signup',
    session: true
  }), auth.setTokenCookie);

module.exports = router;

和相应的passport.js

var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;
var monk_db = rekuire('server/monk_db');
var loggingAndErrors = rekuire('./loggingAndErrors');
var auth = require('../auth.service');
var config = require('../../config/environment');
var jwt = require('jsonwebtoken');
var expressJwt = require('express-jwt');
var validateJwt = expressJwt({ secret: config.secrets.session });
var jwtDecode = require('jwt-decode');
var ObjectID = require("bson-objectid");

exports.setup = function (User, config) {
  passport.use(new GitHubStrategy({
      clientID: config.github.clientID,
      clientSecret: config.github.clientSecret,
      callbackURL: config.github.callbackURL,
      passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
      //loggingAndErrors.logger.log(accessToken);
      var token = req.cookies.token;
      var decoded = jwtDecode(token);
      var user_id = decoded._id;
      var db = monk_db.getDb();
      var users = User.getUsers(db);
      users.findById(ObjectID(user_id), function(err, user) {
        if (err) {
          loggingAndErrors.loggerError.log(err);
          return done(err);
        }
        //loggingAndErrors.logger.log(profile);
        user.github=profile._json
        user = User.newUser(user);
        user.update(db).onResolve(function(err, result) {
          if (err) {
            loggingAndErrors.loggerError.log(err);
            return done(err);
          }
          //loggingAndErrors.logger.log(user);
          loggingAndErrors.logger.log("calling done(err, user) for user_id:", user.userData._id);
          return done(null, user.userData);
        });
      });
    }
  ));
};

崩溃的原因是:

{ statusCode: 404,
data: '{"message":"Not\
Found","documentation_url":"https://developer.github.com/v3"}' }
GET /auth/github/callback?code=7c0c6dff81cdd9417301 500 945.444 ms - 674
InternalOAuthError: Failed to fetch user profile
at /home/joel/workspace/Tracker2/node_modules/passport-github2/lib/strategy.js:118:21
at passBackControl (/home/joel/workspace/Tracker2/node_modules/passport-github2/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:123:9)
at IncomingMessage.<anonymous> (/home/joel/workspace/Tracker2/node_modules/passport-github2/node_modules/passport-oauth2/node_modules/oauth/lib/oauth2.js:142:7)
at IncomingMessage.emit (events.js:129:20)
at _stream_readable.js:908:16
at process._tickDomainCallback (node.js:381:11)

共有1个答案

史默
2023-03-14

我刚刚遇到了同样的问题,所以这里是对我有效的方法。

使用passport-github2并在进行身份验证时请求访问用户的电子邮件地址:

passport.authenticate('github', { scope: [ 'user:email' ] }));

GitHub OAuth文档中列出了您可能希望访问的其他权限。

 类似资料:
  • 我试图解决Dijkstra算法上的一个hackerrank问题--https://www.hackerrank.com/challenges/dijkstrashortreach。我在使用我自己的Dijkstra代码逻辑。虽然我的代码解决了更容易的测试用例,但它在更高的测试用例上失败了。我猜我的代码在某个地方缺少了一些传递性,并且我得到的某个节点的值高于预期。你能帮我找出我的错误吗?问题:输入格式

  • 问题内容: 任何人都对使用Resque时GitHub如何处理Redis服务器的潜在故障或暂时不可用有任何见解? 还有其他一些人似乎使用Zookeeper将半复杂的解决方案组合在一起作为redis集群的保留(请参阅https://github.com/ryanlecompte/redis_failover和Resque故障转移redis解决方案。其他人似乎具有“穷人故障切换”功能,在连接问题一见钟情

  • 是的,我知道《埃拉托斯特尼筛》在标准的图书馆Prime类中,但我正在尝试实现自己的练习。 我正在逐字逐句地按照维基百科上的描述进行操作: 通过Eratosthenes的方法找到所有小于或等于给定整数n的素数:1.创建一个从2到n的连续整数列表:(2,3,4,…, n)。 2.最初,让p等于2,第一个素数。 3.从p开始,通过以p为增量计数到n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4

  • 我正在使用Angular2 final(2.0.2)和angular cli。我正在尝试将其设置为使用PhantomJS运行单元测试。使用Chrome和karma Chrome launcher运行规范-所有测试都通过。在Phantomjs预构建2.1中运行相同的功能。13和karma phantomjs launcher 1.0。2次测试失败。 我添加了phantomjs启动器到插件数组中kar

  • 我真的不明白为什么jsonB会抱怨反序列化以及我该如何修复它。此外,在某些时候,我希望是,但这可以等待关系和反序列化工作。

  • 我正在为一个业余项目工作Java REST api,我使用Heroku作为我的部署平台。我设法使用部署了应用程序。 检测不到set buildpack https://codon-buildpacks.s3.amazonaws.com/buildpacks/heroku/java.tgz 更多信息:https://devcenter.heroku.com/articles/buildpacks#d