[我们目前正在开发具有微服务架构的应用程序,具有以下组件,如下图所示,并且一切正常,但是需要注意以下几点。
为了克服第一个问题,我们可以将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>
我认为使用开放ID连接存在概念问题。
Open id connect不是作为oauth2的身份验证/授权协议,它是oauth2之上的一层,用于向客户端提供用户信息。
因此,idtoken中包含的信息的目标受众是试图消耗资源(前端)而不是资源服务器(微服务)的应用程序。如您所见]
https://openid.net/specs/openid-connect-core-1_0.html
必须发送到微服务的令牌是与idtoken一起发出的访问令牌,因为这是必须用于授权操作的令牌。
另一个问题是,您可能需要用户信息才能在服务中执行某些操作,但这不是同一流程的一部分。
认证/授权流程仅确保一个用户有效,并且有权在某些资源服务器(微服务)上执行某些操作
如果这样,当身份验证过程结束时,您需要获取用户信息,可以使用jwt令牌(自编码访问令牌)作为访问令牌,而不是不透明的令牌,因此您可以在子声明中获取用户ID ,并以此查询用户服务以获得其他信息。
[其他选项,如果您正在zuul网关中进行acces令牌验证,则是在验证令牌时,您可以在网关中获取用户信息,并将自定义jwt传递给具有所需信息的微服务。该令牌不必是访问令牌,因为网关已经完成了身份验证/授权操作。
这样,您可以毫无问题地刷新访问令牌