1

アプリで次のフローが必要です

  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()、またはシリアライゼーションまたはデシリアライゼーションがどのように使用されているかも説明してください。

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 に答える