Spring OAuth2 ResourceServer 依赖地狱

Dev*_*ker 7 spring spring-boot spring-security-oauth2

我想实现一个资源服务器(Spring Boot Rest Backend 并通过 OAuth2 和 JWT 进行保护)。

我运行了一个资源服务器,它处理来自 Keycloak 身份验证服务器的 JWT 令牌。但是我对如何验证 JWT 令牌的知识仍然存在差距。

深入查看 Spring 参考文档会打开 Hellmouth。

Spring OAuth2 Boot Reference 中有一个指向特性矩阵的链接。该矩阵列出了以下用于实现资源服务器的 spring 选项。

  • Spring Security OAuth (2.2.+)
  • Spring 安全 (5.1.+)
  • Spring Cloud 安全 (1.2.+)
  • Spring Boot OAuth2 (1.5.x)

但是现在我发现了以下依赖项

  • 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.6.RELEASE'

此依赖项指的是哪个 Spring 项目或 Starter?矩阵是否过时?如果是这样,我在哪里可以找到选择合适的解决方案以实现资源服务器的当前概述?

一切都非常不透明,谁能给这片黑暗带来一些光明?

Nat*_*Far 5

此依赖项指的是哪个 Spring 项目或 Starter?矩阵是否过时?

您链接到的引用和spring-security-oauth2-autoconfigure依赖项适用于现在处于维护模式的 OAuth 项目。正如功能矩阵中提到的,Spring Security 5 旨在取代之前单独开发的所有 OAuth 项目。但是,Spring Security 5 仍然不支持创建授权服务器,所以它还没有完全实现。但是,由于您正在实现资源服务器,因此 Spring Security 5 绝对是您要走的路。

如果是这样,我在哪里可以找到选择合适的解决方案以实现资源服务器的当前概述?

查看Spring Security 5 文档以获取有关如何实现资源服务器的详细信息。

提示 #1:正如前面提到的,“过时”的 Spring Security OAuth 项目有很多教程。每当您看到@EnableResourceServer注释时,您就会知道这是旧的做事方式。

这是“Spring Security的5路”: http.oauth2ResourceServer()

提示#2:如果您使用的是 Spring Boot,则需要以下依赖项:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-resource-server</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

为什么?那么你需要 starter 来使用 Spring Security 5。文档解释了为什么你需要最后两个:

大多数资源服务器支持被收集到 spring-security-oauth2-resource-server 中。但是,对解码和验证 JWT 的支持在 spring-security-oauth2-jose 中,这意味着为了拥有支持 JWT 编码的承载令牌的工作资源服务器,两者都是必需的。


小智 -1

JWT 是一个 RFC 标准(RFC 7519)标准,就像 OAuth 2.0 (RFC 6749)一样,用于表示两方之间的声明。

我们一一来说吧。

  1. 在 OAuth 2.0 中,会生成一个令牌,可用于访问资源服务器上存在的受保护资源。
  2. 生成的默认令牌通常是一个随机字符串,其中不包含任何信息,并且资源服务器需要为您在幕后使用授权服务器进行的每次点击来验证授权服务器的令牌
  3. 为了获取用户信息(如果需要),包括权限、角色、名称等,资源服务器必须通过将令牌传递到指定的 URL 来询问授权服务器,因为令牌本身是一个随机字符串
  4. 现在您可能会问,“如果资源服务器必须为我向授权服务器发出的每个请求验证我的令牌,您是否认为我向资源服务器发出的每个请求都会有很大的延迟”。答案是肯定的!将有。这就是智威汤逊的用武之地。
  5. 使用 JWT,我们可以将资源服务器可能需要的所有信息嵌入到令牌字符串本身中。因此,现在,该随机令牌字符串变成了编码(未加密或散列)的字符串,资源服务器可以轻松解码该字符串,而无需与授权服务器进行任何交互
  6. 那部分很好。但是资源服务器如何知道 JWT 负载信息是否未被篡改。毕竟,我可以更改 JWT 中的权限来提升访问权限。这就是 JWT 签名部分的用武之地。
  7. 如果 JWT 是使用非对称密钥对创建的,则签名部分包含预共享密钥,也可以是公钥,该非对称密钥对基本上验证有效负载信息未被篡改

现在回答你的问题

但首先需要注意的是。Spring社区正在对Spring Security项目进行前所未有的变革,这是对整个项目的重写。请观看此视频了解更多信息。所以你的困惑并不罕见。网络上有很多示例都考虑了使用 Spring 实现 OAuth 流程的旧方法。

在资源服务器端,您需要一个转换器来将您的 JWT 转换为实际的有效负载,并且您必须向该转换器提供签名密钥,以便它可以验证 JWT 是否有效。

关于依赖项,我已经使用 Spring Boot 成功实现了授权服务器和资源服务器的两个单独的模块,这是我在两侧使用的依赖项只有两个

org.springframework.boot:spring-boot-starter-security org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure

所以你的依赖地狱树看起来像

  • 春季安全 (5.1.+)
  • org.springframework.security.oauth.boot:spring-security-oauth2-自动配置

毕竟不是地狱;)