我正在尝试使用OAuth2,GitHub和使用通行证对用户进行身份验证。
我有一个非常简单的用户模型,纯粹是出于测试目的。
var mongoose = require("mongoose"),
Schema = mongoose.Schema;
UserSchema = new Schema({
email: { type: String, unique: true }
});
mongoose.model("User", UserSchema);
路线或多或少直接来自护照的文件。
router.get("/github", passport.authenticate("GitHub", { scope: ["user"] }));
router.get("/github/callback", passport.authenticate("GitHub", {
successRedirect: "/#/user/authenticated",
failureRedirect: "/#/auth/error"
}));
在serializeUser和deserializeUser之后,我有以下内容:
passport.use('GitHub', new OAuth2Strategy({
authorizationURL: 'https://github.com/login/oauth/authorize',
tokenURL: 'https://github.com/login/oauth/access_token',
clientID: 'client id',
clientSecret: 'too secret for you to handle',
callbackURL: 'http://dev.corvid.com:3000/auth/github/callback'
}, function(accessToken, refreshToken, profile, done) {
User.findOneAndUpdate(
{ _id: profile.id }, // what to query for
{ $set: { email: profile.email } }, // the update arguments
{ new: true, upsert: true}, // the options
function(err, user) {
done(err, user);
});
}
));
但是,我似乎无法按照预期的那样工作。它指示我在github上进行身份验证,我接受。然后我被重定向回我的网站以获得以下消息:
{"message":"Cast to string failed for value \"undefined\" at path \"email\""}
快速console.log显示该配置文件是一个空对象{}
。
如何在单页应用上管理用户身份并使用护照验证OAuth2?
编辑:最后一页的网址如下所示:http://dev.corvid.com:3000/auth/github/callback?code=xxxx
答案 0 :(得分:0)
这似乎有效
var passport = require("passport");
var GitHubStrategy = require("passport-github").Strategy;
var mongoose = require("mongoose");
var User = mongoose.model("User");
passport.serializeUser(function(user, done) {
var query = { githubId: user.id };
var update = { $set: {
githubId: user.id,
name: user.displayName,
avatarUrl: user._json.avatar_url,
profile: user._json
}};
var options = { new: true, upsert: true };
User.findOneAndUpdate(query, update, options, function(err, u) {
return done(err, u);
});
});
passport.deserializeUser(function(id, done) {
User.find({ "githubId": id }, function(err, user) {
done(err, user);
});
});
passport.use(new GitHubStrategy({
clientID: 'identification',
clientSecret: 'too secret to handle',
callbackURL: 'http://dev.corvid.me:3000/auth/github/callback'
}, function(accessToken, refreshToken, profile, done) {
process.nextTick(function() {
return done(null, profile);
});
}
));