护照因 404 失败 - GitHub 的 InternalOAuthError 为啥?
Posted
技术标签:
【中文标题】护照因 404 失败 - GitHub 的 InternalOAuthError 为啥?【英文标题】:Passport failing with 404 - InternalOAuthError for GitHub why?护照因 404 失败 - GitHub 的 InternalOAuthError 为什么? 【发布时间】:2015-10-24 05:52:34 【问题描述】:我有在 Google 和 Facebook 工作的护照。我试图添加 Github 以添加这些凭据,以便我可以进行经过验证的 Github API 调用。因此,我只是添加了与使用 Google 或 Facebook 凭据登录时相同的模式。
但是在从 Github 发生身份验证回调后,我在代码中间看到了 InternalOAuthError。这发生在几乎最后一行:'return done(null, user.userData);'叫做。尝试调试会干扰回调。所以我希望对护照更清楚的人可以解释我做错了什么。
真正奇怪的是,我已经从 github 收到了用户配置文件,并使用“user.update(db)”存储在我的数据库中,就像我使用 google 一样。然后当我尝试通过调用 done(...) 返回时发生崩溃。
我需要在 github 上的个人资料中添加一些内容吗?或者是其他东西? 或者这是因为我之前已经使用过护照使用 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】:我刚刚遇到了同样的问题,所以这对我有用。
在验证时使用passport-github2 并请求访问用户的电子邮件地址:
passport.authenticate('github', scope: [ 'user:email' ] ));
GitHub OAuth documentation 中列出了您可能想要访问的其他权限。
【讨论】:
非常感谢这个提示。这让我越过了这个障碍。但不是在允许访问之后,我发现它抛出:错误:无法将用户序列化到会话中。 ---也许这也与权限有关?我会调查,但如果有误,请指教。 刚刚意识到我需要添加:passport.serializeUser(function(user, done) done(null, user); ); passport.deserializeUser(function(user, done) done(null, user); );这解决了这个问题。 ---- 再次感谢。以上是关于护照因 404 失败 - GitHub 的 InternalOAuthError 为啥?的主要内容,如果未能解决你的问题,请参考以下文章