没有会话的 Passport js 身份验证

Posted

技术标签:

【中文标题】没有会话的 Passport js 身份验证【英文标题】:Passport js authentification without sessions 【发布时间】:2014-10-20 06:19:16 【问题描述】:

我是 expressjs 和 passportjs 的初学者。 我使用 GoogleStrategy 的护照通过谷歌进行身份验证。使用下面的代码,我在 /users/hello 路由处理程序中有req.user = id: '123456' ,但我想在没有会话支持的情况下获得类似的东西,以将其作为经过身份验证的客户端的答案发送。换句话说,如果在没有 cookie 会话启动的情况下身份验证成功,我想向客户端发送一些令牌。当我关闭会话时,我找不到如何将用户对象转发到目标路由处理程序的方法。

passport.use(new GoogleStrategy(
    returnURL: 'http://localhost/auth/google/return',
    realm: 'http://localhost/'
  ,
  function(identifier, profile, done) 
    done(null, id: '123456');
  
));

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

passport.deserializeUser(function(id, done) 
    done(null, id: id);
);

app.use(session( secret: 'keyboard cat' ));
app.use(passport.initialize());
app.use(passport.session());

app.get('/auth/google', passport.authenticate('google');
app.get('/auth/google/return',
    passport.authenticate('google', 
        successRedirect: '/users/hello',
        failureRedirect: '/users/goodbye' 
    ));

【问题讨论】:

我认为 Google OAuth 不打算在没有会话的情况下工作。 我不会调用google api,我只需要验证用户使用我自己的api。我预计这种行为不取决于我使用的策略。 【参考方案1】:

要关闭会话,请尝试更改此设置:

app.get('/auth/google/return',
passport.authenticate('google', 
    successRedirect: '/users/hello',
    failureRedirect: '/users/goodbye' 
));

到:

app.get('/auth/google/return',
passport.authenticate('google', 
    session:false
));

【讨论】:

可能还必须在 app.js 中注释掉 passport.use(session()) ......然后每次有对服务器的请求时我都必须登录...... 这会抛出OAuth authentication requires session support. Did you forget to use express-session middleware?(可能是因为@waldo-jeffers 所说的

以上是关于没有会话的 Passport js 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

将服务器移动到 CORS 位置时,Passport/Express 会话身份验证中断

通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证,使用 Passport?

设置 passport-jwt 身份验证

Nest.js 中使用 @nestjs/passport 的可选身份验证

Laravel 5.3 + Passport:总是未经身份验证的错误

如何在服务器端使用passport js本地用户身份验证后在客户端使用cookie显示用户信息?