我们目前正在开发具有微服务架构的应用程序,其具有以下组件,如下图所示,并且一切正常,但是需要注意以下几点。
要克服第一个问题,我们可以将access_token传递给微服务而不是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>
答案 0 :(得分:2)
我认为使用开放ID连接存在概念问题。
Open id connect不是像oauth2一样的身份验证/授权协议,它是oauth2之上的一层,用于向客户端提供用户信息。
因此,idtoken中包含的信息的目标受众是正在尝试消耗资源(前端)而不是资源服务器(微服务)的应用程序。如您所见
https://openid.net/specs/openid-connect-core-1_0.html
必须发送到微服务的令牌是与idtoken一起发布的访问令牌,因为这是用于授权操作的令牌。
另一个问题是您可能需要用户信息才能在服务中执行某些操作,但这不是同一流程的一部分。
身份验证/授权流仅确保一个用户有效,并且有权在某些资源服务器(微服务)上执行某些操作
如果这样,当身份验证过程结束时,您需要获取用户信息,我建议您三种可能的解决方案:
您可以将jwt令牌(自编码访问令牌)用作访问令牌,而不是不透明的令牌,因此您可以在子声明中获取用户ID,然后查询用户服务以获取另一个信息。
与第一点一样,您可以使用jwt acces令牌,此外还可以添加自定义声明以存储其他用户信息
如果您正在zuul网关中进行acces令牌验证,则可以在网关中获取用户信息,并将自定义jwt传递给具有所需信息的微服务。该令牌不必是访问令牌,因为身份验证/授权操作已由网关完成。
这样,您可以毫无问题地刷新访问令牌
答案 1 :(得分:0)
我认为您的关键问题是令牌在没有用户任何控制的情况下过期。
您可以考虑以下选项。
在SPA中保留一个定期任务,该任务将检查当前时间以及IDToken的到期时间。当令牌即将到期时(在不到5分钟的时间内说),SPA将提示一个小对话框,并要求用户输入其凭据。提交表单后,新令牌将被接收并替换到会话/本地存储或cookie中。
这样,当用户提交表单时,它将带有新令牌。
与当前服务相比,这将不需要任何其他服务,而您仅需要SPA中的其他功能。
这是用户必须再次输入密码。
如果您可以定义另一个服务来接收Referh_token和IDToken并将其存储,则SPA可以保持定期发送心跳请求。可以在用户将页面聚焦时发送请求,或者用户正在与页面本地交互。 (例如,每5分钟可以在鼠标移动/滚动等情况下发送)。
后端服务将检查令牌是否即将到期,然后它将使用刷新令牌获取新令牌,然后将其传递给SPA。 SPA将在其末尾更新令牌以用于后续请求。只要用户在页面上工作,所有这些都会在后台发生,而不会打扰用户。
您将不得不处理其他复杂性,以换取用户便利。