将护照 openID-stategy 与 JWT 相结合

And*_* T. 4 authentication node.js express jwt passport.js

我在尝试使用 openID ( passport-steam )对passport.js 进行身份验证时遇到问题,然后使用令牌(JWT) 而不是会话。

我当前的代码如下所示:

app.post('/auth/steam', passport.authenticate('steam'));

app.get('/auth/steam/return',
  passport.authenticate('steam', { failureRedirect: '/', session: false }),
  function(req, res) {
    var token = jwt.encode({ useridentifier: req.user.identifier}, tokenSecret);

    res.redirect('/');
  });
Run Code Online (Sandbox Code Playgroud)

但是,我遇到的问题是:我应该如何将令牌传送回客户端?由于是从 Steam 站点返回后运行的 GET 请求,我无法简单回复

res.json(token)
Run Code Online (Sandbox Code Playgroud)

就像我看到人们将本地策略与 JWT 一起使用一样。

我设法想出的唯一解决方案涉及使用包含令牌的会话(例如连接闪存),并在他被重定向到“/”后通过 REST API 将其与客户端通信,但使用 JWT 的全部意义是为了避免使用会话,不是吗?

And*_* T. 5

经过多天的思考而无处可去,我设法找到了另一种解决方法,即使用 cookie。

我发现了 Passport 提供的自定义回调,我可以在其中设置响应的标头,所以我在重定向之前设置了一个这样的:

res.cookie('token', token, { httpOnly: true }); 
Run Code Online (Sandbox Code Playgroud)

(尚不安全,因为我只是在本地服务器上进行测试)

这就是整个代码现在的样子:

app.get('/auth/steam', passport.authenticate('steam'));

app.get('/auth/steam/return', 
  function(req, res, next) {
    passport.authenticate('steam', function(err, user, info){ 
      var payload = {
        user: user.identifier
      };

      var token = jwt.sign(payload, "thisisnotthesecretiactuallyuse", {expiresIn : 60*60*24});
      res.cookie('token', token, { httpOnly: true /* TODO: Set secure: true */ }); 

      res.redirect('/'); 
    })(req, res, next)
  });
Run Code Online (Sandbox Code Playgroud)