我有护照与谷歌和Facebook合作。我试图添加Github来添加这些凭据,以便我可以进行有效的Github API调用。所以我只是使用Google或Facebook凭据添加了我用于登录的相同模式。
但是我在Github进行auth回调后,在代码中间看到了InternalOAuthError。这种情况发生在接近最后一行:' return done(null,user.userData);'叫做。尝试调试会干扰回调。因此,我希望有一个关于护照更清晰的人可以解释我做错了什么。
真正奇怪的是,我已经收到了来自github的用户个人资料,并以与用户谷歌相同的方式存储在我的数据库中,其中包含了用户。更新(db)'然后当我尝试通过调用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)
答案 0 :(得分:3)
我遇到了同样的问题,所以这对我有用。
使用passport-github2并在验证时请求访问用户的电子邮件地址:
passport.authenticate('github', { scope: [ 'user:email' ] }));
您可能希望访问GitHub OAuth documentation中列出的其他权限。