【发布时间】: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 应用程序,在后续调用中使用它。您甚至可以使用秘密签署此令牌以验证其真实性
标签: facebook security authentication oauth-2.0 facebook-oauth