我是Node新手并尝试设置Node& Passport用于在身份验证时创建JWT。
我希望建立一个"无状态认证机制"减少返回和转发到数据库的需要。
通过"无状态",如果没有共享机密或JWT保存在数据库中,我假设服务器重新启动,所有已发布的JWT(登录用户)都无效,因此需要一个新的JWT,供所有用户访问受保护的路由。我不希望用户在每次服务器重新启动或新实例旋转时重新登录。
我相信我可以将静态共享密钥传递给Node环境,每次都可以使用它来生成不会影响服务器重启的相同JWT。
问题:
如果一个好的做法是传递共享的秘密,我应该在哪里以及如何创建这个共享秘密?以及我必须传递的所有共享秘密是什么?
但是,如果将共享密钥传递给Node环境不是一个好策略,我很乐意接受建议吗?
更新
当我说" key(s)"时,我的意思是共享秘密。我会更新问题,以免造成混淆。
答案 0 :(得分:1)
实际上,将密钥作为环境传递是此类应用程序的推荐方法。
因为正在运行的应用程序只能看到环境,所以减少了泄漏密钥的可能性(与其他应用程序代码提供的配置文件相比)。
通常情况下,您不会经常旋转按键,通常每月旋转一次,假设您控制环境。
但请记住,密钥仅用于证明令牌是由您签名的,通常最好只在令牌中包含一小部分信息(出于性能原因)。因此,您仍需要访问数据库以检索有关用户自身的额外信息。您可以在令牌中添加所有用户信息,但请记住,需要为每个请求发送令牌,这会增加开销。
如果您使用像supervisord这样的流程管理器,您可以在那里设置环境并为配置文件提供适当的权限,以避免密钥泄漏。
我通常使用环境将这种信息传递给我的节点应用程序,我将它用于JWT,AWS密钥,SMTP凭据等。它可以使代码解耦并避免可能的错误,例如将私钥推送到公共代码版本控制系统像github。