首先要做的事情是查看这篇关于使用 OAuth2.0 进行身份验证的文章。根据您的背景,您可能需要自己阅读 OAuth 和 OpenID Connect。
但是,如果您只想将服务器端会话保持在签名和加密的 JWT 中,那也没关系。在您的 JWT 中,您将需要一些声明,至少有一些声明:
- 会话何时创建 (iat)
- 会话仍然有效多长时间(exp)
- 谁创建了会话,那是您的身份验证系统 (iss)
- 谁通过此会话进行身份验证,即您的用户 ID 或其他东西(子)
稍后您可以添加一个观众,最好是一个随机数。但是,如果您要对所有内容进行加密,您也可能会在没有随机数的情况下继续使用它。
参考OIDC 核心规范中建议的声明通常是一个好主意。
这就是它变得棘手的地方。您基本上有两个选择 - 您可以在服务器端生成一个字符串,该字符串对所有应用程序完全不透明并成为会话。然后提供一个令牌自省端点,客户端可以将此字符串发送到并检索上述声明(以及您决定映射到会话的所有其他声明)。这也意味着您将需要一些存储,这些不透明字符串与用户声明它们映射到的位置一起被持久化。
或者,您可以对整个文件进行签名(并可选择加密)并通过网络发送。仅当您需要能够注销用户时,您才需要为令牌提供一个 ID。使用私钥对令牌进行签名,只有您的应用程序知道,任何客户端中的验证都由公钥完成,您的应用程序可以共享该公钥,例如通过提供 JWKs 端点。
根据您在 JWT 中提出的声明,您可能根本不需要加密它......但是,如果您这样做,那么是的,您还必须管理用于加密的密钥。
另请查看这篇文章,以获得关于令牌身份验证内容的非常好的概述。