node.js - Passport 失败并出现 404 - GitHub 的 InternalOAuthError 为什么?

标签 node.js express github passport.js

我拥有与 Google 和 Facebook 合作的通行证。我尝试添加 Github 来添加这些凭据,以便我可以执行经过验证的 Github API 调用。因此,我只是添加了与使用 Google 或 Facebook 凭据登录时相同的模式。

但是在从 Github 进行身份验证回调后,我在代码中间看到了 InternalOAuthError 。当几乎最后一行:“return done(null, user.userData);”时会发生这种情况叫做。尝试调试会干扰回调。所以我希望对 Passport 有更清楚了解的人可以解释我做错了什么。

真正奇怪的是,我已经从 github 收到了用户配置文件,并使用“user.update(db)”存储在我的数据库中,就像我对 google 所做的那样。然后当我尝试通过调用done(...)返回时发生崩溃。

我需要在 github 上的个人资料中添加一些内容吗?或者是其他东西? 或者这是因为我很早就已经使用 Passport 使用谷歌凭据登录。请注意,对于 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)

最佳答案

我刚刚遇到了同样的问题,所以这对我有用。

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

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

您可能还想访问 GitHub OAuth documentation 中列出的相同权限。 .

关于node.js - Passport 失败并出现 404 - GitHub 的 InternalOAuthError 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31765009/

相关文章:

node.js - 如何在 TS-Node 中声明初始化全局变量?

javascript - 使用 Axios 删除 React 中的请求

javascript - 从多个位置删除相同的值 Firebase 函数

javascript - 如何设置关于路由器的快速模块?

javascript - Node JS + Express JS : What is routes/index. js 及其用途?

javascript - 带参数验证的 ExpressJS 嵌套路由

javascript - 如何在mongodb中分配id值?

在 Windows 上使用 node.js child_process.spawn() 找不到 github ssh 公钥,但在 child_process.exec() 上可见

缓存的 Git diff 什么都不做

ssh - 为 GitHub 设置 SSH key