使用护照和猫鼬模型查找或创建用户

时间:2015-01-25 00:41:54

标签: node.js mongodb mongoose passport.js

我正在尝试使用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

1 个答案:

答案 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);
    });
  }
));