OppenId 连接配置 Spring Security OAuth2

OppenId connect configuration over Spring Security OAuth2

有一些 Micro 由 Zuul 网关支持,所有这些都由 Spring Security OAuth2 保护。场景是:

1- Zuul 网关作为 OAuth2 客户端。

2- 所有支持的应用程序都作为 OAuth2 资源服务器。

3- 一个应用程序运行正在作为 OAuth2 授权服务器 (UAA)。

OAuth2的流程是Authorization code流程。由于 Pricipal 获取用户信息的所有资源服务器都像这样调用授权服务器的端点:

security:
  oauth2:
    resource:
      user-info-uri: http://localhost:9191/uaa/user

一切都按预期正常工作。

需要说明的是,所有的应用都是运行通过Spring启动

我想使用 Jwt,以便我能够将声明提取为用户信息,而不是调用授权服务器的端点。所以我在谷歌上搜索并找到 openid connect approach 但我没有找到合适的 openid 连接配置 Spring Security OAuth2.

有两个问题:

1- openid 连接是否适合我的问题?如果有,有没有link帮忙,

2-如果不是,哪种技术适合我的问题。

我觉得你需要弄清楚JWT, OAuth 2.0 and OpenID Connect.
之间的区别 阅读每个 RFC 是最安全的选择,但这里有一个概述。

OAuth 2.0 是一个授权框架/协议。
OAuth 2.0 授权服务器的最终目标是提供可用于保护应用程序安全的访问令牌。访问令牌的目标只是告诉资源服务器是否允许客户端访问某些内容,它不必包含有关用户的信息(但它可以)。 OAuth 2.0 不对令牌格式或如何验证令牌做出任何假设。

OpenID Connect 建立在 OAuth 2.0 之上以提供身份验证。与访问令牌一起,身份提供者 a.k.a。 IdP(启用身份的 OAuth 2.0 授权服务器)可以提供访问令牌和 ID 令牌。
ID Token 以标准格式 (JWT) 包含有关用户的身份信息。
OpenID Connect 专为单点登录 (SSO) 和需要用户 details/profile(通常 UI)的应用程序而构建。

JWT是一种token格式,授权和认证都可以使用。
ID 令牌必须是 JWT,而访问令牌可以是 JWT 或不透明(随机字符串)。
JWT 的优点是资源服务器只需要签名密钥来验证令牌。它是当今最流行的解决方案,非常适合您想要实现的目标(HTTP API 安全性)。
不透明令牌可以被视为更安全(不包括用户信息),但它需要一些带外过程来验证:调用授权服务器上的端点,共享数据库...

TL;DR :如果您的用例只是 HTTP API 安全性,则您只需要 OAuth 2.0,不一定需要 OpenID Connect。带有 JWT 格式访问令牌的 OAuth 2.0 非常方便,Spring 安全性提供了开箱即用的良好支持。授权服务器通常包括用户信息,例如用户名和最终权限,因此您不必从每个服务中查找它。

所有托管身份解决方案(例如 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 安全验证的字段(连同签名)
  • username :请​​注意,此字段是可选的(令牌可以传送到客户端应用程序,而无需通过客户端凭据授予让用户参与)
  • scope : 授予客户端应用程序的权限
  • cognito:groups :包含用户对基于角色的访问控制的权限的自定义声明,您可以将其映射到 Spring 安全机构——非标准

有用:jwt.io 创建和解码 JWT。