node.js - 如何使用状态参数使 OAuth 流安全
问题描述
背景:前端是一个 Airtable 应用程序(基本上是一个运行在 Airtable UI 中的 iframe)。后端是一个带有 Postgres 数据库的 Node 服务器,在 Heroku 上运行。我正在使用 Firebase 进行身份验证。我正在尝试添加与 Shopify 的 OAuth 集成。
- OAuth 要求我使用该
state
参数来防止 CSRF 攻击,后端应该使用该参数来检查发起请求的会话是否与处理重定向的会话相同。 - OAuth 流程从我的 Airtable 应用程序开始。它调用
window.open('https://{shop}.myshopify.com/admin/oauth/authorize?client_id={api_key}&scope={scopes}&redirect_uri={redirect_uri}&state={nonce}&grant_options[]={access_mode}')
,这将打开一个新选项卡,引导用户完成 Shopify OAuth 流程。 - 在我的
redirect_uri
应用程序之外(它是一个后端 URL)。因为这是在新选项卡中发生的,所以它与启动流程的会话不同,因此无法检查state
参数是否来自同一会话。
当前解决方案
我设置state
为accountId
用户的,所以当 Shopify 重定向到 时redirect_uri
,后端知道授权码是针对哪个用户的。这可行,但它不满足验证会话相同和防止 CSRF 攻击的要求。
潜在的解决方案
当用户发起一个请求时,将第一个请求从 Airtable 应用程序发送到后端 URL,创建一个会话(例如使用),然后使用此会话作为参数express-session
将它们重定向到 Shopify 。state
然后可以在重定向后使用它,方法是检查会话是否与发起请求的会话相同。
此解决方案似乎满足 OAuthstate
要求。但是,当用户打开从 Airtable 应用程序到后端的初始链接时,需要包含一些内容以供后端识别它们(例如accountId
,JWT)。
如果攻击者将其中一个链接与他们自己的帐户详细信息共享(例如在网络钓鱼电子邮件中),并且用户通过了 OAuth 流程,则用户会将其 Shopify 帐户链接到我的服务中的攻击者帐户。有没有办法避免这种情况?
解决方案
推荐阅读
- flutter - 如何在持久导航栏中增加主页按钮圆圈的大小
- android - 保存为 gs:// 或 https:// 用于用户的图像。哪种方式值得推荐?
- sql - 如何从 min - max 中获取数据,将同一表中的两列连接起来
- web - 如何在 CD 上创建一个带有 Web 服务器的网站
- android - Google Places API 建立取货点
- javascript - 如何将 next.js 应用部署到 Cpanel?
- tradingview-api - 有谁知道为什么它说变量 ,,`len` 已声明”,我该如何修复它... 交易视图
- javascript - 如何获取要保存在 Firestore 中的复选框的值?
- java - java 8中BiConsumer接口的使用
- javascript - 如果其他对象的属性为假,那么数组中对象的一个属性如何为真?