我们真的需要在 OIDC 的隐式流中使用 id_token 吗?

Posted

技术标签:

【中文标题】我们真的需要在 OIDC 的隐式流中使用 id_token 吗?【英文标题】:Do we really need id_token in implicit flow in OIDC? 【发布时间】:2018-07-23 19:02:28 【问题描述】:

我正在开发一个 SPA 应用程序,我正在使用推荐的隐式流程,并且能够获取 access_token 和 id_token。由于我需要的不仅仅是个人资料信息,因此我创建了一个单独的端点来返回用户个人资料信息(以及特定于我们业务的所有其他信息),并且该端点受到保护,并且只能使用 access_token 作为访问不记名令牌。在 SPA 中获取 access_token 后,我立即调用此端点以获取所有用户信息(包括显示在 UI 上的名字、姓氏等)。如果返回的 id_token 和 access_token 对有任何问题,则用户配置文件信息端点调用将失败。那么,我真的需要验证 id_token 吗?因为我不依赖该令牌中的任何信息。

对于针对外部登录提供程序或授权代码流进行身份验证,验证 id_token 是有意义的,但就我而言,我不确定。

根据 OpenID 规范:

当使用隐式流程时,ID 令牌的内容必须以与第 3.1.3.7 节中定义的授权代码流程相同的方式进行验证,但本节中指定的差异除外. 1. 客户端必须使用 JOSE Header 的 alg Header Parameter 中指定的算法,根据 JWS [JWS] 验证 ID Token 的签名。 2. 必须检查 nonce Claim 的值,以验证它是否与 Authentication Request 中发送的值相同。客户端应该检查重放攻击的 nonce 值。检测重放攻击的精确方法是特定于客户端的。

【问题讨论】:

想知道为什么你做了一个额外的端点为什么不直接使用docs.identityserver.io/en/release/endpoints/userinfo.html @DalmTo:正如我提到的,我们的自定义端点返回的不仅仅是常规的用户身份相关信息,而且它位于不同的数据库中......所以我不想把它带入 IdP 你为什么首先使用 OpenID Connect? @KcDoD 只有一个我们正在构建的应用程序是 SPA,我们还有一些 MVC、移动和其他应用程序......其他 OIDC 流程对其他应用程序很有用 验证刷新令牌,即使您此后不使用它也有好处,因为验证包括检查随机数,以确保您获得预期的响应。 oidc-client-js 库为您完成了这一切,您在使用它吗? 【参考方案1】:

为什么不在授权请求中使用response_type 参数。通过更改其值,您可以更改收到的授权响应内容。

身份文档提到了可能的response type 值。以下是他们documentation的摘录,

如您所见,如果您不希望 SPA 接收 id 令牌,您可以将 response_type 值设置为令牌。如果这样做,您只会获得一个访问令牌,这是由 OAuth 2.0 规范强制执行的。 (请参阅here 中的 OAuth 2.0 的隐式流 response_type 解释)。请注意,当您使用 response_type=token 时,您使用的是 OAuth 2.0(不是 OIDC)

只要您利用各自协议启用的功能,我认为您的方法没有任何问题。

【讨论】:

试过了,效果很好!不过,单独的注销体验有点不同。我很感激!

以上是关于我们真的需要在 OIDC 的隐式流中使用 id_token 吗?的主要内容,如果未能解决你的问题,请参考以下文章

OIDC 隐式流 - 重定向 uri 长度

自定义声明包含在隐式流中,但不包含在 PKCE 流中

在 OAuth 2.0 隐式流中验证​​ nonce 的位置?

是否可以仅请求用户已在 Azure AD OAuth2 隐式流中同意的范围的子集?

SPA 如何在 OAuth2 隐式流中提取访问令牌

如何在 SPA 中实现 OAuth 隐式流?