spring-security 如何配置Sping Boot 以通过调用授权服务器的instropection端点来验证JWT标记

f0brbegy  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(175)

我有一个简单的资源服务器应用程序,用Sping Boot ,这是yaml文件:

server: 
  port: 8081
  servlet: 
    context-path: /resource-server-jwt

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:8083/auth/realms/rasool

现在,我想在配置或代码中进行更改,以强制Spring Security使用授权服务器的调用内省端点来验证JWT标记,而不是使用密钥进行本地验证,但我没有找到任何spring security docs所说的方法。

voase2hg

voase2hg1#

Spring引导spring.security.oauth2.resourceserver.jwt.*配置属性适用于JWT解码器
对于标记introspection,请改用spring.security.oauth2.resourceserver.opaque-token.*属性(标记可以是任何格式,包括JWT)。“opaque”表示资源服务器将标记视为“黑盒”,资源服务器将验证和属性检索委托给内省端点上的授权服务器:

server: 
  port: 8081
  servlet: 
    context-path: /resource-server-jwt

spring:
  security:
    oauth2:
      resourceserver:
        opaque-token:
          introspection-uri: http://localhost:8083/auth/realms/rasool/protocol/openid-connect/token/introspect
          client-id: change-me
          client-secret: change-me

来自.well-known/openid-configuration的自检URI
如果您使用Java配置,则交换机大致相同:将http.oauth2ResourceServer().jwt()...替换为http.oauth2ResourceServer().opaqueToken()...

关于授权服务器上声明的客户端的一些注意事项

授权服务器自检端点上的资源服务器自检标记使用客户端凭据流:对于它处理的每个请求,资源服务器都将向授权服务器发送一个请求以获取令牌详细信息。这可能会对性能产生严重影响。是否确实要切换到令牌自检?
因此,在上述属性中,必须使用以下内容配置客户端:

  • “访问类型”设置为confidential
  • 已激活“启用服务帐户”

如果你还没有的话,可以创建一个。一旦保存了配置,你将从“凭证标签”中获得客户端密码。
请注意,您应该有其他(公共)客户端来标识用户(从Web /移动的应用程序或REST客户端),并代表这些用户查询资源服务器。
从授权服务器的Angular 来看,这意味着访问令牌将被发放给(公共)客户端,并由另一个(机密)客户端进行自检。

完整工作样品here

它为资源服务器做了一些有用的事情:

  • 权限Map(选择用于解析用户权限的属性,前缀和大小写处理)
  • CORS配置
  • 无状态会话管理
  • 带有Cookie存储库的CSRF
  • 为已配置的公共路由列表启用匿名
  • 在尝试访问缺少授权或授权无效的受保护资源时,出现401(未授权)而不是302(重定向到登录)

相关问题