如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)

Posted

技术标签:

【中文标题】如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)【英文标题】:How to save JWT token recieved from auth0 login securely (nodejs express) 【发布时间】:2020-02-20 22:46:27 【问题描述】:

我是 Auth0 的新手,并试图在我的常规快速 Web 应用程序中实现它。我需要在用户访问我的某些端点之前保护/验证用户。我的理解是,我可以使用从登录回调返回的 JWT 来执行此操作。我已经做到了这一点,但是当我登录时,它会重定向,我不确定如何传递访问令牌/将其安全地存储在客户端。

这是我登录后回调端点的样子。它返回授权码,但我从这里迷路了。

https://auth0.com/docs/api-auth/tutorials/authorization-code-grant

我在登录时返回这个:

/callback?code=oi9-ZTieXo0hYL6A&state=sMJAUK4QVs7jziJ7lXvwmGKF

// Perform the final stage of authentication and redirect to previously requested URL or '/user'
router.get('/callback', function (req, res, next)      
  passport.authenticate('auth0', function (err, user, info) 
    if (err)  return next(err); 
    if (!user)  return res.redirect('/login'); 
    req.logIn(user, function (err) 
      if (err)  return next(err); 
      const returnTo = req.session.returnTo;
      delete req.session.returnTo;  
        res.redirect('/user);
    );
  )(req, res, next);
);

我从这里去哪里?

【问题讨论】:

使用JS sessionStorage存储token怎么样? w3schools.com/jsref/prop_win_sessionstorage.asp 如果这是安全的方式,那么我完全赞成。我如何重定向并返回此代码(其 req.url)?如果我不认为必须重定向,我无法在消息中发送它 一旦你拥有它,你就将它附加到每个受保护的 http 请求的标头中。 是的,但我如何将它发送给客户?我只是在 url 中附加令牌吗?所以 res.redirect '/user' + req.token ? 你可以使用“http-only”cookie;添加“安全”标志以增加安全性。 http-only 标志防止浏览器将 cookie 暴露给前端 JS,并且安全标志使浏览器通过加密连接(通过 HTTPS)传输它。然后,您可以解压缩 cookie 并检索令牌以在您的验证功能中进行验证。阅读更多here 【参考方案1】:

Auth0 不建议将令牌存储在浏览器存储(会话/本地存储)中。对于客户端应用程序,令牌应该是短暂的,并在必要时通过静默身份验证进行更新(通过与身份验证服务器在隐藏 iframe 中的 cookie 会话进行更新)。

此处概述: https://auth0.com/docs/security/store-tokens

如果您有后端,则在那里处理令牌,如果您使用的是 SPA + API,则使用链接中概述的策略。

【讨论】:

以上是关于如何安全地保存从 auth0 登录收到的 JWT 令牌(nodejs express)的主要内容,如果未能解决你的问题,请参考以下文章

通过 Express / Auth0 后端登录用户

验证 Auth0 JWT 抛出无效算法

登录 Auth0 后找不到如何获取访问令牌

如何使用 auth0 jwt 识别用户

Spring boot + JWT 实现安全验证 ---auth0.jwt

如何查看存储在 JWT 中的数据?使用 auth0 和 express-jwt