首页 > 解决方案 > OpenID Connect - 隐式流随机数

问题描述

我对如何将 nonce 参数实际用于 OpenID Connect 感到非常困惑。我正在尝试通过 Microsoft Azure 和 Google 对用户进行身份验证,分别使用 Azure 和 Google 登录。

这是我当前的(隐式)流程。

  1. 当用户在浏览器中加载我们的登录页面时,两个客户端库 google 和 azure msal 将使用我们的客户端 ID 进行初始化。
  2. 登录页面上有两个按钮,每个按钮都会打开来自相应提供商的弹出窗口,重定向到 Google/Microsoft 登录页面。
  3. 用户输入他们的 Google/Microsoft 用户名和密码并登录。成功验证后弹出窗口关闭,并且 ID 令牌返回给浏览器 JavaScript。
  4. 浏览器 JavaScript 获取 ID 令牌并将其发送到我们的后端,然后我们在后端验证 JWT。
  5. 成功验证后,我们为用户创建一个会话,并将浏览器重定向到仪表板。

我很困惑nonce在哪里适合所有这些,因为我使用的是基于JavaScript的流而不是HTTP,所以不需要?它是否由浏览器客户端库隐式处理?

如何确保攻击者无法在 Google/Microsoft 服务器和浏览器以及浏览器和后端之间嗅探 ID 令牌,而只是重新发送该 ID 令牌以验证用户身份?

标签: node.jsazureoauthopenidgoogle-identity

解决方案


与攻击nonce非常相似state,也可以用来反击replay。主要区别是在重定向 URI 中返回nonceid_tokenstate在重定向 URI 中返回。通常库应该为您生成它并在 id_token 中进行验证。

顺便说一句,如果您可以访问后端,我建议您改用代码流(或至少使用新的 PKCE 流),因为隐式流很快就会被弃用。


推荐阅读