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。
有一些 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。