我认为您需要澄清JWT、OAuth 2.0 和OpenID Connect 之间的区别。
阅读每个 RFC 是您最安全的选择,但这里是一个概述。
OAuth 2.0 是一种授权框架/协议。
OAuth 2.0 授权服务器的最终目标是提供可用于保护应用程序的访问令牌。访问令牌的目标只是告诉资源服务器是否允许客户端访问某些内容,它不必包含有关用户的信息(但它可以)。 OAuth 2.0 不对令牌格式或如何验证令牌做出任何假设。
OpenID Connect 构建在 OAuth 2.0 之上以提供身份验证。除了访问令牌,身份提供者(又名 IdP)(启用身份的 OAuth 2.0 授权服务器)可以同时提供访问令牌和 ID 令牌。
ID 令牌包含标准格式 (JWT) 的用户身份信息。
OpenID Connect 专为单点登录 (SSO) 和需要用户详细信息/配置文件(一般为 UI)的应用程序而构建。
JWT 是一种令牌格式,您可以将其用于授权和身份验证。
ID 令牌必须是 JWT,而访问令牌可以是 JWT 或不透明(随机字符串)。
JWT 的优点是资源服务器只需要签名密钥来验证令牌。它是当今最流行的解决方案,非常适合您想要实现的目标(HTTP API 安全性)。
不透明令牌可以被视为更安全(不包括用户信息),但它需要一些带外过程来验证:调用授权服务器上的端点,共享数据库......
TL;DR :如果您的用例只是 HTTP API 安全,您只需要 OAuth 2.0,不一定需要 OpenID Connect。带有 JWT 格式的访问令牌的 OAuth 2.0 非常方便,并且 Spring Security 提供了开箱即用的良好支持。授权服务器通常包含用户信息,例如用户名和最终权限,因此您不必从每个服务中查找。
所有托管身份解决方案(例如 Okta、Auth0、AWS Cognito)都实现了 OAuth 2.0 和 OpenID Connect,因此您无需进行选择。如果您想自己安装授权服务器,RedHat 的 Keycloak 也是如此。
请注意 Spring Security 的授权服务器仅实现 OAuth 2.0(不透明和 JWT 令牌)。该项目处于维护模式。
以下是来自 AWS Cognito 的访问令牌中的 JWT 有效负载示例:
{
"sub": "806b6ec5-6e12-4933-915c-6bd489464a36",
"cognito:groups": [
"admin",
"whatever"
],
"iss": "https://cognito-idp.eu-central-1.amazonaws.com/eu-central-1_hLzeyVm80",
"version": 2,
"client_id": "6jfufigqn4j14hrim4gj76mkjc",
"event_id": "c074951c-4244-4011-8ef9-449f7552eab1",
"token_use": "access",
"scope": "aws.cognito.signin.user.admin phone openid whatever_you_want",
"auth_time": 1563965719,
"exp": 1563969319,
"iat": 1563965719,
"jti": "e751e0ef-aff4-4197-bf73-b8ef898ba3fc",
"username": "806b6ec5-6e12-4933-915c-6bd489464a36"
}
有趣的是:
-
expiry : 令牌过期,只有 Spring Security 验证的字段(连同签名)
-
username :请注意,此字段是可选的(令牌可以传递到客户端应用程序,而无需通过客户端凭据授予涉及用户)
-
scope :授予客户端应用程序的权限
-
cognito:groups :自定义声明,包含用户对基于角色的访问控制的权限,您可以将其映射到 Spring Security 权限——非标准
有用:jwt.io 创建和解码 JWT。