Spring boot OIDC刷新令牌方案

问题描述 投票:2回答:1

[我们目前正在开发具有微服务架构的应用程序,具有以下组件,如下图所示,并且一切正常,但是需要注意以下几点。

  1. [为了保护网关和深度微服务之间的通信,我们正在传递IDToken并在每个微服务级别对其进行验证,但是,一旦IDtoken过期,服务将返回401状态代码,然后在Ui上,我们触发授权流,最终将导致整页刷新,并且如果用户位于中间,如果提交非常大的表格,那么按照OIDC规范,所有数据都会丢失,我们无法刷新ID令牌,因此不确定如何处理这种情况。
  2. 为了克服第一个问题,我们可以将access_token传递给微服务而不是idtoken,但是我们每次都需要调用/userinfo端点以从提供者那里获取用户信息,并考虑进行高并发性,因此继续进行下去是一种好习惯吗?

  3. 或者我们在这里丢失了一些东西,有更好的替代方法解决此问题?

任何帮助将不胜感激

enter image description here

application.yml文件中的Spring boot OIDC属性

security:         
    oauth2:
      client:
        registration: 
          pingIdentity: 
            scope:
            - openid
            - profile
            - email
            - phone
            - job_title
            - scoped_entitlement
            - authorization_group
            - entitlement_group
            - organizational_data
            - basic_start_authorization            
            client-id: <Client  ID>
            client-secret:  <Client  Secret>
            provider: pingIdentity
        provider:
          pingIdentity: 
            issuer-uri: <Issuer URI>
java spring-security microservices openid-connect spring-security-oauth2
1个回答
0
投票

我认为使用开放ID连接存在概念问题。

Open id connect不是作为oauth2的身份验证/授权协议,它是oauth2之上的一层,用于向客户端提供用户信息。

因此,idtoken中包含的信息的目标受众是试图消耗资源(前端)而不是资源服务器(微服务)的应用程序。如您所见]

https://openid.net/specs/openid-connect-core-1_0.html

必须发送到微服务的令牌是与idtoken一起发出的访问令牌,因为这是必须用于授权操作的令牌。

另一个问题是,您可能需要用户信息才能在服务中执行某些操作,但这不是同一流程的一部分。

认证/授权流程仅确保一个用户有效,并且有权在某些资源服务器(微服务)上执行某些操作

如果这样,当身份验证过程结束时,您需要获取用户信息,可以使用jwt令牌(自编码访问令牌)作为访问令牌,而不是不透明的令牌,因此您可以在子声明中获取用户ID ,并以此查询用户服务以获得其他信息。

[其他选项,如果您正在zuul网关中进行acces令牌验证,则是在验证令牌时,您可以在网关中获取用户信息,并将自定义jwt传递给具有所需信息的微服务。该令牌不必是访问令牌,因为网关已经完成了身份验证/授权操作。

这样,您可以毫无问题地刷新访问令牌

© www.soinside.com 2019 - 2024. All rights reserved.