【问题标题】:JWT with Node & Passport: Restarting serverJWT with Node & Passport:重启服务器
【发布时间】:2016-10-23 13:05:21
【问题描述】:

我是 Node 新手,正在尝试设置 Node 和 Passport 以在身份验证时创建 JWT。

我希望建立一个“无状态的认证机制”来减少对数据库的回传。

通过“无状态”,如果没有共享机密或 JWT 保存在数据库中,我假设如果服务器重新启动,所有已发布的 JWT(登录用户)都将失效,因此需要一个新的 JWT用户访问受保护的路由。我不希望用户在每次服务器重新启动或新实例旋转时重新登录。

我相信我可以将静态共享密钥传递给 Node 环境,我每次都可以使用它来生成不影响服务器重启的相同 JWT。

问题:

  1. 如果一个好的做法是传递共享密钥,我应该在哪里以及如何创建这个共享密钥?以及我必须传递哪些共享机密?

  2. 但是,如果将共享密钥传递给 Node 环境不是一个好的策略,我愿意听取建议吗?

更新

当我说“密钥”时,我指的是共享秘密。我会更新问题,以免造成混淆。

【问题讨论】:

  • 为什么需要将密钥存储在数据库中?识别用户所需的信息通常存储在 JWT 本身中,服务器只需要知道密钥的秘密即可验证密钥的信息没有被更改。请参阅 this page 以直观地展示 JWT 的组成部分。
  • 抱歉 - 我更新了问题。

标签: node.js express passport.js express-jwt


【解决方案1】:

实际上将密钥作为环境传递是此类应用程序的推荐方式。

因为环境仅对正在运行的应用程序可见,并减少了泄露密钥的可能性(与其他应用程序代码提供的配置文件相比)。

通常您不会经常轮换密钥,假设您可以控制您的环境,通常每月轮换一次密钥。

但请记住,密钥仅用于证明令牌是由您签名的,通常最好只在令牌中包含少量信息(出于性能原因)。所以你仍然需要去数据库中检索有关用户本身的额外信息。您可以在令牌中添加所有用户信息,但请记住,需要为每个请求发送令牌,这会增加开销。

如果你使用像supervisord 这样的进程管理器,你可以在那里设置环境,并为配置文件赋予适当的权限以避免密钥泄漏。

我通常使用环境将此类信息传递给我的节点应用程序,我将其用于 JWT、AWS 密钥、SMTP 凭证等。它使您的代码保持解耦并避免可能出现的错误,例如将私钥推送到公共代码版本控制系统喜欢github。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 2019-02-22
    • 2016-02-28
    • 1970-01-01
    • 2021-05-05
    • 2021-04-14
    • 2017-01-26
    • 2015-11-30
    • 2019-03-29
    相关资源
    最近更新 更多