Facebook OAuth 安全使用护照-facebook

Posted

技术标签:

【中文标题】Facebook OAuth 安全使用护照-facebook【英文标题】:Facebook OAuth security using passport-facebook 【发布时间】:2020-09-02 18:11:27 【问题描述】:

我目前正在使用客户端 React 组件让用户在我的应用程序中通过 OAuth 登录 Facebook。在服务器端,我使用 npm 包passport-facebook-token 在客户端成功登录后验证accessToken 的真实性。

我不经常看到的一种做法是除了询问 Facebook accessToken 是否有效之外,服务器不应该还检查客户端有效负载提供的电子邮件是否与从 Facebook 返回的电子邮件匹配?请允许我使用已定义的客户端/服务器技术来说明我的问题:

1) 用户使用客户端上的 React 组件向 Facebook 进行身份验证。

2) React 组件成功通过 Facebook 身份验证,并使用访问令牌和用户电子邮件向服务器发出 HTTP 请求。

3) 运行 Node.JS 和 passport-facebook 的服务器现在需要直接从 Facebook 验证访问令牌的真实性。 Facebook 不关心电子邮件。它只会验证访问令牌。

4) Facebook 向 Node.js 返回响应,确认访问令牌的真实性。该响应还包含有关用户的其他元数据,包括他们的电子邮件和其他个人资料数据。

我的问题是,Node.js 是否应该接收同样从 Facebook 的访问令牌验证有效负载返回的电子邮件,并验证它是否是从 React 客户端返回的?这不会阻止某人暴力破解accessToken 并要求他们不仅拥有accessToken 还要知道accessToken 属于谁?这可能会阻止用户向 Node.js 服务器提交一堆 HTTP POST 请求,尝试使用不同的访问令牌。他们不仅要猜测分配给应用程序客户端 ID 的访问令牌,还要知道它所属的电子邮件。这是一种过度设计的方法吗?

【问题讨论】:

#1 这会阻止还是会阻止? #2 你的最后一段让我有点困惑。您的问题是否与向护照 nodejs 提供和提议的当前授权流程添加额外验证(来自 react 的电子邮件和来自 facebook 的电子邮件必须匹配)有关? 我编辑了我的问题。我希望这能让我想问的问题更加清晰。 为什么要执行第 3 步和第 4 步? Facebook 提供基于 oauth 的登录。 Facebook 已为该特定用户完成了验证。现在访问令牌可用于访问 facebook API。我觉得你不需要验证访问令牌。您能否更好地描述用例/场景,以便我了解您打算实现的目标? @manishg Facebook 已在客户端验证用户。服务器需要相信此验证是真实的。 您的 OAuth 流程对我来说有点奇怪。一般来说,发生的情况是:React 客户端调用您的后端登录,您的后端触发 facebook 身份验证,该身份验证重定向到用户登录并表示同意的 Facebook 登录页面。之后,Facebook 会调用您的 URL 回调并向您发送用户的数据。您获取此数据,生成一个身份验证令牌(例如 JWT 令牌),然后将其发送到 react 应用程序,在后续调用中使用它。您甚至可以使用秘密签署此令牌以验证其真实性 【参考方案1】:

您验证电子邮件和令牌的方法有点多余,因为 Facebook 的不透明用户访问令牌本质上与电子邮件相关联。

来自Facebook

访问令牌是标识用户、应用或页面的不透明字符串

“不透明”由 Auth0 here 定义

不透明访问令牌是专有格式的令牌,通常包含服务器持久存储中信息的一些标识符

在您的情况下,标识符是用户的电子邮件,服务器属于 Facebook。

我会进一步阐述。这是您逐步进行的一些修改:

    用户使用客户端上的 React 组件向 Facebook 进行身份验证,将他们的 电子邮件密码 直接输入 Facebook。 React 组件在登录成功时从 Facebook 获取令牌

    React 组件成功通过 Facebook 身份验证,并使用访问令牌和用户电子邮件向服务器发出 HTTP 请求。

    运行 Node.JS 和 passport-facebook 的服务器现在需要直接从 Facebook 验证访问令牌的真实性。 Facebook 不关心电子邮件。它只会验证访问令牌因为访问令牌已经绑定到电子邮件

    Facebook 向 Node.js 返回响应,确认访问令牌的真实性。该响应还包含有关用户的其他元数据,包括他们的电子邮件和其他个人资料数据。

This 是 Facebook 的漏洞赏金计划。如果他们的 OAuth 真的被破解到需要第二次电子邮件验证的程度,那么这种激励措施几乎会立即对其进行修补。

【讨论】:

【参考方案2】:

我能想到的让您的 OAuth accessToken 和“代码”值不易被暴力破解的最佳方法是使用加密数字生成器创建一个 128 位长度的随机数据字符串并将其编码为base 64 用作您的代码。计算机或重定向到授权端点和带有查询参数的redirect-uri 的人几乎不可能猜到它。

另一种强化方法是通过 IP 地址限制授权率(您可以通过 Node.js 代替电子邮件),但这对于大多数装备精良的黑客来说通常不是问题。我强烈建议使用第一种方法来创建更安全的服务。

【讨论】:

以上是关于Facebook OAuth 安全使用护照-facebook的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

访问护照中的会话信息

环回护照手机登录

对 Facebook 网站整合的担忧。访问令牌

登录 facebook oauth 访问令牌是不是安全?

护照谷歌oauth和护照谷歌令牌有啥区别?