【发布时间】:2020-02-20 06:55:35
【问题描述】:
我有三台服务器: - 授权服务器 - api服务器 - 前端服务器
授权服务器返回 JWT 自包含访问令牌(+刷新令牌)。 JWT 不存储在授权服务器中的任何位置。 我想用非对称加密来保护 JWT,但我不确定我的想法是否正确。 让我描述一下流程:
- 从前端服务器登录后,授权服务器获取用户凭据,然后生成 JWT 令牌并使用公钥对其进行编码。
- 前端服务器接收加密的 JWT 令牌,客户端(Web 浏览器)将其保存为 HTTP-Only cookie。
- 客户端向安全资源发送请求,因此前端根据获得的编码 JWT 令牌,请求安全数据 API 服务器。
- API 服务器基于安全的 JWT 和私钥解密值,并检查用户是否有足够的访问权限来执行操作。
- 如果 JWT 令牌过期,前端会使用刷新令牌向授权服务器发送请求以获取新的 JWT 令牌。
在这种情况下,授权服务器和 API 服务器需要存储私钥以进行解密。 这个解决方案是否足够安全?可以在两台服务器中存储相同的私钥吗? 你知道流量是否正确吗?或者也许数据流应该不同?
【问题讨论】:
-
通常令牌的内容不是秘密,但您要保证它是由授权服务器生成的。这将指向签名而不是加密,并且只有授权服务器应该拥有签名密钥。
-
我强烈建议您使用现有组件,而不是尝试自己在这里推出一些东西。例如。如果您在基于 .NET 的堆栈中,Identity Server 可能是一个选项。
-
不幸的是,我无法继续使用标准方法。无论如何,如果您的身份验证服务器签署令牌,那么后端将如何验证签名?
-
使用非对称算法进行签名时,私钥用于签名,公钥用于验证。不需要共享私钥,只有认证服务器知道私钥。
-
那么后端服务器如何在不解密整个令牌的情况下知道用户权限是什么?