node.js - 将 Passport openID 策略与 JWT 相结合

标签 node.js authentication express passport.js jwt

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

我当前的代码如下所示:

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('/');
  });

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

res.json(token)

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

我设法想出的唯一解决方案涉及使用包含 token 的 session (例如 connect-flash),并在他被重定向到“/”后通过 REST API 将其传达给客户端,但重点使用 JWT 是为了避免使用 session ,不是吗?

最佳答案

经过多日无果的思考,我想出了另一种解决方法,即使用 cookie。

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

res.cookie('token', token, { httpOnly: true }); 

(还不安全,因为我只在本地服务器上测试)

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

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)
  });

关于node.js - 将 Passport openID 策略与 JWT 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32844596/

相关文章:

javascript - Sails.js 获得多对多关联计数

javascript - 在 Node JS 中将值从一个对象更新到另一个对象

authentication - 具有用户名/密码身份验证的 ncat ssl 连接?

android - 使用电话号码注册

mysql - Sequelize 将此作为响应返回 [ {'primaryKey' :null}] to findAll method

javascript - 生成 1024 位 RSA key 对并将公钥以 ASN.1 格式(十六进制)保存在 node.js 中

node.js - 如何检测socket.io服务器是否已连接?

node.js - 提供 css 和 javascript 文件

c# - 使用 Identity 2.0 在 MVC 应用程序和 WCF 服务之间传递身份验证

node.js - 不支持选项 [useMongoClient]