Nodejs - Passport - 无法将用户序列化为会话

时间:2017-02-24 10:44:25

标签: node.js passport.js

我正在使用以下库:

passport-oauth2-password-grant

我要做的是以下内容:

  1. 对API进行身份验证(用户名/密码)
  2. 获取访问令牌
  3. 从API获取用户个人资料
  4. 使用护照登录用户
  5. 我正在使用以下实现:

    PasswordGrantStrategy.prototype.userProfile = function(accessToken, done) {
        return done(null, { real_name: 'Foo Baz', email: 'test@test.com' });
    
    }
    passport.use(new PasswordGrantStrategy({
        tokenURL: 'http://api.local/oauth/token',
        clientID: "2",
        clientSecret: "",
        grantType: "password",
    },
    function(accessToken, refreshToken, profile, done) {
      return done(null, profile);
    }));
    
    function authenticate() {
        return function(req, res, next) {
            var username = "email@email.com";
            var password = "password";
    
            passport.authenticate('password-grant', {
                username: username,
                password: password
            })(req, res, next);
        };
    }
    

    使用用户名/密码登录API

    它正在将配置文件传递给passport.use(new PasswordGrantStrategy的回调函数,但是,我收到以下错误:

      
        

    无法将用户序列化为会话

      

    它应该是序列化的,因为我传入一个配置文件,一切看起来都很好。现在这是否意味着会话可能存在问题?

2 个答案:

答案 0 :(得分:2)

您需要向Passport提供serializeUser和deserializeUser方法才能使其正常工作。

来自官方文档:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

答案 1 :(得分:0)

要小心地序列化和反序列化功能,必须包含相同的用户对象。这两个功能的用户对象必须相同

    passport.serializeUser((user, done)=>{
        done(null, user);
    });

    passport.deserializeUser((user, done)=>{
        done(null, user);
    });