node.js - OpenID Connect - 隐式流随机数
问题描述
我对如何将 nonce 参数实际用于 OpenID Connect 感到非常困惑。我正在尝试通过 Microsoft Azure 和 Google 对用户进行身份验证,分别使用 Azure 和 Google 登录。
这是我当前的(隐式)流程。
- 当用户在浏览器中加载我们的登录页面时,两个客户端库 google 和 azure msal 将使用我们的客户端 ID 进行初始化。
- 登录页面上有两个按钮,每个按钮都会打开来自相应提供商的弹出窗口,重定向到 Google/Microsoft 登录页面。
- 用户输入他们的 Google/Microsoft 用户名和密码并登录。成功验证后弹出窗口关闭,并且 ID 令牌返回给浏览器 JavaScript。
- 浏览器 JavaScript 获取 ID 令牌并将其发送到我们的后端,然后我们在后端验证 JWT。
- 成功验证后,我们为用户创建一个会话,并将浏览器重定向到仪表板。
我很困惑nonce在哪里适合所有这些,因为我使用的是基于JavaScript的流而不是HTTP,所以不需要?它是否由浏览器客户端库隐式处理?
如何确保攻击者无法在 Google/Microsoft 服务器和浏览器以及浏览器和后端之间嗅探 ID 令牌,而只是重新发送该 ID 令牌以验证用户身份?
解决方案
与攻击nonce
非常相似state
,也可以用来反击replay
。主要区别是在重定向 URI 中返回nonce
,id_token
而state
在重定向 URI 中返回。通常库应该为您生成它并在 id_token 中进行验证。
顺便说一句,如果您可以访问后端,我建议您改用代码流(或至少使用新的 PKCE 流),因为隐式流很快就会被弃用。
推荐阅读
- .net-core - 在 .Net 5 中找不到 IActionSelectorDecisionTreeProvider 命名空间
- c++ - 在 MinGW 编译的 C++ 程序中播放音乐文件
- python-3.x - 动态检查数据框中的每个系列的短语并删除
- unit-testing - 单元测试 - 模拟服务和存储库/工作单元层
- java - 如果另一个资源位于特定节点中,则获取资源
- assembly - 如何更改 NASM 中的变量(x86,Microsoft Windows 10)
- swift - 如何从 Kotlin 移动平台访问 Array 到 iOS 或 Android?
- sql - 如何在 SQL Server 中创建一天中的时间段
- calculated-columns - Spotfire 根据每个组的日期计算单个列中值的差异
- c++ - 在 gradle c++ 项目中配置 C++ 标准?