【问题标题】:Nodejs - Passport - Failed to serialize user into sessionNodejs - 护照 - 无法将用户序列化到会话中
【发布时间】:2017-07-15 04:00:57
【问题描述】:

我正在使用以下库:

passport-oauth2-password-grant

我想要做的是:

  1. 对 API 进行身份验证(用户名/密码)
  2. 获取访问令牌
  3. 从 API 获取用户配置文件
  4. 使用护照登录用户

我正在使用以下实现:

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 的回调函数但是,我收到以下错误:

无法将用户序列化到会话中

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

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

    您需要向 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);
      });
    });
    

    【讨论】:

    • deserializeUser 从未被调用 - serializeUser 被调用,但没有别的。
    • 你用什么来存储会话?
    • 我在app.js 中只有以下内容:app.use(passport.session()); 正在存储会话?!?我认为这就是我出错的地方,但似乎无法弄清楚如何处理会话
    • 会话需要存储在某个地方,以便 express 可以将后续请求与序列化用户进行比较。请查看npmjs.com/package/express-session 之类的内容 - 实现起来非常简单
    • 我的项目后端有 postgres,所以我将上面的包与另一个写入 postgres 的包一起使用:npmjs.com/package/connect-pg-simple
    猜你喜欢
    • 2019-03-26
    • 2015-06-17
    • 1970-01-01
    • 2014-12-12
    • 2021-03-14
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    相关资源
    最近更新 更多