1

我想在我的应用程序中使用以下流程

  1. 用户选择通过 google 进行身份验证
  2. 我重定向到谷歌并获得回调(这使用 Passport 发生)

我现在想以响应用户的形式返回一个特定于我的应用程序的身份验证令牌。

  var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

passport.use(new GoogleStrategy({
    clientID: GOOGLE_CLIENT_ID,
    clientSecret: GOOGLE_CLIENT_SECRET,
    callbackURL: "http://127.0.0.1:3000/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    // RETURN ACCESS  TOKEN IN THE RESPONSE
  }
));

我确实得到了成功回调,但我不知道如何从回调函数返回自定义访问令牌/响应。

我猜答案与使用 done() 或序列化或反序列化有关,我从文档或任何示例中都不清楚。您能否还解释一下 done() 或序列化或反序列化是如何使用的。

4

1 回答 1

0

您可以在序列化和反序列化中执行此操作。请参阅此护照示例

userSchema.methods.generateRandomToken = function () {
  var user = this,
    chars = "_!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
    token = new Date().getTime() + '_';

  for ( var x = 0; x < 16; x++ ) {
    var i = Math.floor( Math.random() * 62 );
    token += chars.charAt( i );
  }
  return token;
};

var User = mongoose.model('User', userSchema);

//serialize
passport.serializeUser(function (user, done){
        var createAccessToken = function() {
            var token = user.generateRandomToken()
            User.findOne({
                accessToken: token
            }, function(err, existingUser){
                if (err) { return done(err) }
                if (existingUser) {
                    createAccessToken()
                } else {
                    user.set('accessToken', token)
                    user.save(function(err){
                        if (err) { return done(err) }
                        return done(null, user.get('accessToken'))
                    })
                }
            })
        }

        if (user._id) {
            createAccessToken()
        }
    })


//deserialize
passport.deserializeUser(function(token, done){
        User.findOne({
            accessToken : token
        }, function(err, user){
            done(err, user)
        })
    })
于 2014-05-26T19:42:21.243 回答