【问题标题】:OppenId connect configuration over Spring Security OAuth2OppenId 通过 Spring Security OAuth2 连接配置
【发布时间】:2019-12-04 22:59:32
【问题描述】:

有些 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 Boot运行的

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

有两个问题:

1- openid 连接适合我的问题吗?如果是的话,有没有帮助的链接,

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

【问题讨论】:

    标签: spring-boot spring-security single-sign-on spring-security-oauth2 openid-connect


    【解决方案1】:

    我认为您需要澄清JWTOAuth 2.0OpenID 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。

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 2014-04-06
      • 2015-07-02
      • 2018-10-02
      • 2019-11-12
      • 2012-12-25
      • 1970-01-01
      • 2016-03-14
      • 2015-05-08
      相关资源
      最近更新 更多