Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导OIDC刷新令牌场景_Java_Spring Security_Microservices_Openid Connect_Spring Security Oauth2 - Fatal编程技术网

Java Spring引导OIDC刷新令牌场景

Java Spring引导OIDC刷新令牌场景,java,spring-security,microservices,openid-connect,spring-security-oauth2,Java,Spring Security,Microservices,Openid Connect,Spring Security Oauth2,我们目前正在开发具有微服务体系结构的应用程序,如下图所示,具有以下组件,并且一切正常。但是需要对以下几点进行澄清 为了确保网关和Deep microservice之间的通信安全,我们正在传递IDToken并在每个microservice级别对其进行验证。然而,一旦IDToken过期,服务将返回401状态代码,然后在Ui上触发授权流,最终导致整页刷新,如果用户正在提交非常大的表单,则所有根据OIDC规范,数据将丢失。我们无法刷新ID令牌,因此不确定如何处理此情况 为了克服第一个问题,我们可以将ac

我们目前正在开发具有微服务体系结构的应用程序,如下图所示,具有以下组件,并且一切正常。但是需要对以下几点进行澄清

  • 为了确保网关和Deep microservice之间的通信安全,我们正在传递IDToken并在每个microservice级别对其进行验证。然而,一旦IDToken过期,服务将返回401状态代码,然后在Ui上触发授权流,最终导致整页刷新,如果用户正在提交非常大的表单,则所有根据OIDC规范,数据将丢失。我们无法刷新ID令牌,因此不确定如何处理此情况
  • 为了克服第一个问题,我们可以将access_令牌传递给microservice,而不是idtoken,但是我们每次都需要调用
    /userinfo
    端点,以便从提供者处获取用户信息,并且考虑到高并发性,这是一种良好的做法吗

  • 或者我们遗漏了一些东西,有更好的替代方案来解决这个问题

  • 任何帮助都将不胜感激

    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>
    
    安全性:
    oauth2:
    客户:
    注册:
    pingIdentity:
    范围:
    -openid
    -侧面图
    -电子邮件
    -电话
    -职位
    -限定范围的权利
    -授权组
    -权利集团
    -组织数据
    -基本启动授权
    客户端id:
    客户机密:
    提供者:pingIdentity
    供应商:
    pingIdentity:
    发卡机构uri:
    
    我认为使用open id connect存在概念问题

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

    因此,idtoken中包含的信息的目标受众是试图使用资源(前端)的应用程序,而不是资源服务器(微服务)。正如你在这里看到的

    必须发送到microservice的令牌是与idtoken一起发布的访问令牌,因为这是必须用于授权操作的令牌

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

    身份验证/授权流仅确保一个用户是有效的,并且具有在特定资源服务器(microservice)上执行特定操作的权限

    如果在验证过程结束后,您需要获取用户信息,我建议您使用三种可能的解决方案:

  • 您可以使用jwt令牌(自编码访问令牌)作为访问令牌,而不是不透明令牌,因此您可以在子声明中获取用户id,并使用该id查询用户服务以获取其他信息

  • 与第一点类似,您可以使用jwt acces令牌,此外还可以添加自定义声明来存储其他用户信息

  • 如果您在zuul gateway中执行acces令牌验证,则可以在gateway中获取用户信息,并将自定义jwt与所需信息一起传递给微服务。此令牌不需要是访问令牌,因为身份验证/授权操作已由网关完成


  • 通过这种方式,您可以毫无问题地刷新访问令牌

    我认为您的关键问题是令牌在没有用户控制的情况下过期

    你可以考虑下面的选项。

  • 在SPA中保留一个定期任务,该任务将检查当前时间和IDToken的过期时间。当代币即将到期时(比如不到5分钟),SPA会提示一个小对话框,并要求用户输入她的凭证。提交表单后,将在会话/本地存储或cookie中接收并替换新令牌

    这样,当用户提交表单时,表单将与新令牌一起使用

    这将不需要任何额外的服务比目前的,你只需要在水疗中心的附加功能

    这样做的缺点是,用户必须再次输入密码

  • 如果您可以定义另一个服务来接收refresh_令牌和IDToken并存储它,那么SPA可以定期发送心跳请求。请求可以在用户聚焦页面时发送,或者用户在本地与页面交互时发送。(例如,移动/滚动鼠标时每5分钟发送一次)

    后端服务将检查令牌是否即将过期,然后使用刷新令牌获取新令牌,然后将其传递给SPA。SPA将在其末尾为后续请求更新令牌。只要用户在页面上工作,所有这些都将在后台进行,而不会干扰用户

    您将不得不处理额外的复杂性,以换取用户的便利


  • 谢谢你详细的回答。如果我选择实现第一种方法,您是否认为每次调用/userinfo都能很好地理解服务之间的任何其他数据依赖关系,例如,如果订单服务必须在每次需要计算价格时查询商品服务。您可以使用缓存或通过用户事件更新数据的本地副本来解决性能问题。无论如何,最好的选择可能是2。再次感谢。您是否有任何博客链接或github repo链接已实施?抱歉,我所做的此类项目是为客户提供的,因此repo是私有的。感谢您的宝贵意见,我正在标记此答案,但如果您能分享第三种方法的任何参考,我将不胜感激。我的意思是,我们已经实施了此方法,但希望知道它的方法是否正确。