护照与404失败 – 为GitHub InternalOAuthError为什么?

我有与Google和Facebook合作的护照。 我试图添加Github来添加这些凭据,所以我可以做有效的Github API调用。 所以我简单地添加了我用Google或Facebook凭证login的相同模式。

但是在authcallback发生在Github之后,我在代码的中间看到了InternalOAuthError。 这几乎发生在最后一行:'return done(null,user.userData);' 叫做。 尝试debugging干扰callback。 所以我希望有一个更清晰的护照可以解释我做错了什么。

真奇怪的是,我已经从github收到用户configuration文件,并以“user.update(db)”存储在我的数据库中,就像我用google做的一样。 然后,当我试图通过调用done(…)来返回时发生崩溃。

我需要在github上添加一些东西给我的个人资料吗? 或者是其他东西? 或者这是因为我早已使用护照更早login使用谷歌凭据。 请注意,对于Google或Facebook,我指定了会话: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并在进行身份validation时请求访问用户的电子邮件地址:

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

在GitHub OAuth文档中列出的其他权限也可能需要访问其他权限。