我们真的需要在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 OAuth 2.0 隐式流中验证 nonce 的位置?