【问题标题】:Return accesstoken after Oauth Authentication in passport.js在passport.js中进行Oauth身份验证后返回accesstoken
【发布时间】:2014-07-07 23:51:06
【问题描述】:

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

  1. 用户选择通过 google 进行身份验证
  2. 我重定向到 google 并获得回调(这发生在使用 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() 或序列化或反序列化是如何使用的。

【问题讨论】:

    标签: passport.js passport-facebook passport-twitter


    【解决方案1】:

    您可以在序列化和反序列化中执行此操作。看到这个passport example

    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)
            })
        })
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2018-05-03
      • 2020-01-02
      • 2023-04-05
      • 2011-09-09
      • 2023-01-07
      • 2013-06-26
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多