Spring Security Spring授权服务器:通过 Postman 注销

9ceoxa92  于 2023-03-12  发布在  Spring
关注(0)|答案(1)|浏览(305)

我已经设法使用新的Spring授权服务器设置了一个OAuth2身份提供者。为了执行一些测试,我使用了Postman - OAuth2身份验证流程,我能够毫无问题地获得一个JWT令牌。令牌刷新也可以完美地开箱即用。使用获得的令牌,经过相当长的反复试验过程,我能够在另一个Sping Boot 项目上保护一个API。问题是,我不知道如何测试注销过程通过 Postman 。有谁可以帮助我,提供一个链接到任何例子?谢谢你提前。
我希望令牌在进程结束后失效,这样它就不能再用于保护API端点。

7jmck4yq

7jmck4yq1#

RP Initiated Logout是一种使OIDC授权服务器上的用户会话无效的标准方法。在注销方面,并非所有“OIDC”授权服务器都符合规范,但我认为Spring的服务器符合规范。(短)规范,说明如何从.well-known/openid-configuration查找注销端点URI以及如何构建注销请求(方法、参数等)。使用这些元素,您应该能够构建Postman请求以使OP上的用户会话无效。

JWT是不可变的,你不能使它无效(即使你可以,你也永远不能保证你更新了所有现有的副本)。它从发行到过期都是有效的。

您可以使以下位置的用户会话无效:

  • 客户端。这通常伴随着令牌删除
  • 授权服务器。当您这样做时,应该无法:
  • 使用注销前发布的刷新令牌获取新的访问令牌(即使此刷新令牌仍然有效)
  • 自检注销前发出的访问令牌(即使访问令牌仍然有效)

如果您不能信任客户端在用户注销时删除访问令牌,并且如果访问令牌的有效期不够短,无法接受注销后的访问风险,那么您可能必须将资源服务器从JWT解码切换到令牌内省。是的,您可以内省JWT,但不可以,内省根本没有效率。
顺便说一句,如果你不能信任客户端处理访问令牌的方式,那么你就有了一个比用户注销后访问令牌的剩余寿命更大的安全问题...

对第一条评论做出答复

登录和注销是客户端的责任,而不是资源服务器的责任,REST API是资源服务器(它应该依赖于spring-boot-starter-oauth2-resource-server,而不是spring-boot-starter-oauth2-client)。

我敢打赌,您面临的问题不是由于访问令牌仍然有效,而是用户会话仍然有效,并且用户登录是静默完成的,因为这=〉调用授权服务器上的end_session_endpoint,如上面链接的规范所述(是的,您应该按照链接阅读内容)。
您需要执行以下操作:

  • 确保您的API被配置为资源服务器(而不是客户端),并从那里删除登录和注销。
  • 为用户登录和注销配置OAuth2客户端。它可以是:
  • Angular应用程序本身使用了一个像angular-auth-oidc-client这样的库。这个库有很好的文档,很容易使用,只需按照链接浏览到文档。
  • aB确认FF前端(服务器上的中间件,用于保存Angular应用程序的会话,处理登录和注销,从授权服务器获取令牌,将该令牌存储在会话中,然后在将请求从浏览器转发到API之前用访问令牌替换会话cookie)。如果配置为OAuth2客户端并使用TokenRelay过滤器,spring-cloud-gateway可以用作BFF。我在this specific tutorial from the collection linked above中使用spring-cloud-gateway(和Angular)实现了完整的BFF。

无论您为OAuth2客户端选择何种实现(在浏览器中是公开的还是在您的服务器上是保密的),它都有责任触发RP Initiated Logout以使授权服务器上的用户会话无效

  • 我链接的Angular 库就能做到
  • 如果您选择使用Spring的OAuth2客户端实现,您可以配置OidcClientInitiatedLogoutSuccessHandler(或React应用程序中的OidcClientInitiatedServerLogoutSuccessHandler),在您的客户端注销后将用户重定向到授权服务器,以便两个会话都无效

相关问题