Single sign on 如何使用OpenId Connect/OAuth在多个跃点上传递标识

Single sign on 如何使用OpenId Connect/OAuth在多个跃点上传递标识,single-sign-on,openid-connect,oauth2,gluu,Single Sign On,Openid Connect,Oauth2,Gluu,我们目前正在组织内部实现SSO,已经决定使用OpenId Connect作为我们的身份验证协议(特别是使用Gluu) 我们遇到的问题是将一个身份传递给后端服务链,我们可以证明该身份已经过身份验证。我见过有人传递id_令牌,但据我所知,这并不是id_令牌的意图,而是仅用于最初的客户消费 假设我们有一个角度应用程序调用一个相关的REST服务,他们称之为某种数据服务。目前,angular应用程序会将未经身份验证的用户重新定向到Gluu进行登录,并提供id_令牌和access_令牌 Gluu的实现是提供

我们目前正在组织内部实现SSO,已经决定使用OpenId Connect作为我们的身份验证协议(特别是使用Gluu)

我们遇到的问题是将一个身份传递给后端服务链,我们可以证明该身份已经过身份验证。我见过有人传递id_令牌,但据我所知,这并不是id_令牌的意图,而是仅用于最初的客户消费

假设我们有一个角度应用程序调用一个相关的REST服务,他们称之为某种数据服务。目前,angular应用程序会将未经身份验证的用户重新定向到Gluu进行登录,并提供id_令牌和access_令牌

Gluu的实现是提供一个不透明的访问令牌。因此,当我们将该令牌从Angular应用程序传递到REST服务时,我们返回Gluu以验证该令牌,提取与其相关联的用户信息(基于OpenId使用的范围)和客户端信息。这一切都与第一跳很好

从REST服务连接到数据服务时会出现问题。REST服务使用client_凭证流调用Gluu,使其具有数据服务的作用域,以获取新的访问令牌。但是,我没有找到办法将原始令牌交换为保留原始用户声明的新令牌

我看到过这样的建议,人们会说,“好吧,你在一个受信任的域中,所以只需传递用户ID,并相信他们已经过身份验证。”这对我们不起作用。我们以前使用的是HMAC方案,团队传递从未经过身份验证的用户ID,在用户不知情的情况下模拟用户,这就是为什么我们需要一种方法来确保用户已经过身份验证


我觉得我错过了一块拼图。“正确”的方法是什么?

请不要传递id\u令牌。OpenID Connect规范声明id_令牌用于客户端应用程序。我看到这个问题有两种解决方法

1) 要求客户端应用程序请求所有必需的下游作用域,以便其访问令牌适用于所有服务,并且访问群体包含正确的服务。在你的情况下,这可能是不可能的,但我想说这将是最简单(也许不是最好)的方法


2) 我对GLUU一无所知,但是OAuth2.0规范讨论了在您的情况下哪些是有用的。这只是意味着,根据规范,您可以定义自己的授权,而不是“代码”、“密码”和“隐式”。我建议你实施一项定制补助金。您可以定义用于验证用户的自定义信息。我使用的另一个OAuth 2.0/OpenID连接框架名为IdentityServer。尽管不是GLUU,但我认为您将能够理解这篇关于扩展授权的文章,因为最终GLUU和IdentityServer都遵循一个定义良好的协议。这篇文章展示了扩展授权如何解决正确授权身份验证的特定问题。看一看。我希望您可以使用GLUU实现类似的功能。

请不要传递id\u令牌。OpenID Connect规范声明id_令牌用于客户端应用程序。我看到这个问题有两种解决方法

1) 要求客户端应用程序请求所有必需的下游作用域,以便其访问令牌适用于所有服务,并且访问群体包含正确的服务。在你的情况下,这可能是不可能的,但我想说这将是最简单(也许不是最好)的方法


2) 我对GLUU一无所知,但是OAuth2.0规范讨论了在您的情况下哪些是有用的。这只是意味着,根据规范,您可以定义自己的授权,而不是“代码”、“密码”和“隐式”。我建议你实施一项定制补助金。您可以定义用于验证用户的自定义信息。我使用的另一个OAuth 2.0/OpenID连接框架名为IdentityServer。尽管不是GLUU,但我认为您将能够理解这篇关于扩展授权的文章,因为最终GLUU和IdentityServer都遵循一个定义良好的协议。这篇文章展示了扩展授权如何解决正确授权身份验证的特定问题。看一看。我希望您可以实现与GLUU类似的功能。

在选择访问令牌或id\U令牌时,我建议使用
id\U令牌。正确地与目标受众列表以及令牌中所需的组/角色信息一起使用(我不知道gluu是否允许您配置),当然,分离验证,使用id_令牌没有错。这是一个包含身份声明并可以传递的令牌,应该可以使用OP@fiddur更新它。感谢您的回复。这种方法的问题在于,前端客户可能不知道(也可能不应该知道)下游还涉及哪些其他服务,因此无法正确设置受众,除非我们有一些内部应用程序的通用受众…如果REST服务使用客户端凭据流连接到数据服务,那么为什么需要将userinfo传递到数据服务,如果需要传递以获取与用户或类似应用程序相关的数据,那么从技术上讲,userID/userName是发送到数据服务的查询的输入,其中案例用户名/名称应作为数据传递给资源服务器(数据服务)。如果我遗漏了什么,请告诉我同样,ID\u令牌和access\u令牌是不同的。@dvsakgec我们正在使用客户端凭据流,因此会传递客户端ID和客户端密钥。这些应用程序都不能访问用户的凭据(除了IDP、Gluu之外),因此即使我们想访问(我们不想),也不能使用资源所有者flo