ChatGPT解决这个技术问题 Extra ChatGPT

为 iOS 应用程序中的 Facebook 身份验证设计,该应用程序还访问安全的 Web 服务

目标:允许用户通过 Facebook 对 iOS 应用程序进行身份验证,该应用程序需要访问我正在运行的受保护 Web 服务。

假设:对于那些选择不使用 Facebook 登录的用户,有一个本地身份验证(和注册)系统。

细节:

假设我们希望为用户提供使用 Facebook 登录的选项,而无需为我们的系统创建单独的帐户/凭据。

因为我们支持我们自己的本机身份验证机制(用户名和密码),所以我们有自己的用户 ID 并发出身份验证令牌,用于在初始凭据验证后进行后续交互。

我很惊讶 Facebook 在他们的开发者文档中没有这方面的最佳实践。所有现有文档都假设您正在将 FB auth 构建到网站中,或者假设您正在将 FB auth 构建到一个网站中,或者是一个没有需要身份验证的服务的独立移动应用程序。

这是我对如何设计它的初步想法,但想要验证它是否正确。

客户端弹出 Facebook iOS 登录 UI 用户使用 Facebook 凭据登录并获取访问令牌 iOS 应用程序将访问令牌传递给我们的服务器 我们的服务器使用访问令牌与 FB 图 API 对话以 (a) 验证令牌并 (b) 获取 FB 用户该访问令牌的 ID。例如,我们的服务器会调用 https://graph.facebook.com/me/?access_token=XYZ,它会在 JSON 对象中返回配置文件信息假设它是有效的,我们的服务器会从 JSON 对象中提取用户 ID 并检查用户是否已经有一个帐户。如果是这样,我们向客户端发出我们自己的身份验证票以用于该会话。如果用户没有帐户,我们使用 Facebook 用户 ID 创建一个新帐户,分配我们自己的唯一用户 ID 并签发我们的身份验证票。然后,客户端将身份验证票传回需要身份验证的后续交互。

这对我来说似乎是正确的方法,但不确定我是否错过了一些非常基本的东西并走上了错误(复杂)的道路。

这是如何解决的?我也在考虑传递访问令牌,并在服务器上启动用户。看起来很学术,但我问。
这是我使用 rails 和设计的实现:stackoverflow.com/questions/7232490/…
为什么不传递整个 auth_hash 而不必对 FB API 进行两次调用(一次来自 iOS 设备,一次来自服务器)?
如果您想从其他设备登录(意味着您没有身份验证票)怎么办?如果你刚刚收到一张新的身份验证票,是什么阻止了某人在途中劫持 facebook id/token 并在他自己的设备上使用它?
出于好奇,在第 5 步中,为什么要发行您自己的身份验证票?您不能在每个后续服务器调用中使用 Facebook 访问令牌吗?我确实意识到,对于每个应用程序->服务器调用,而不仅仅是第一个调用,它需要从服务器调用 Facebook API。

n
n00bProgrammer

我只是自己处理了这个问题,这是让我感到痛苦的部分:

在您的第 5 步中... 用户可以在您那里注册一个与他们的 Facebook ID 完全不同的帐户,对吗?然后他们又用 Facebook 登录……而你刚刚为他们创建了第二个帐户,却丢失了他们的第一个帐户。

需要有一种方法可以登录到您的 Web 服务,然后登录到 facebook,并捕获 facebook ID 和本地帐户之间的关联。

除此之外,你的计划听起来很可靠。

更新:Facebook 添加了一个文档,概述了这种情况HERE


是的,我已经考虑过了,你说得对。如果是相同的电子邮件地址,我们计划合并帐户,如果不是,我们将创建另一种合并方式。
您在服务器端使用哪个服务器库来发出请求?
@TimLeung - 我的理解是访问令牌嵌入了应用程序 ID,如果没有应用程序 ID,您就无法获得访问令牌。
@TimLeunge:我们正在使用 Graph API 来处理带有用户访问令牌的请求。
n
n00begon

如 Facebook 所述,使用 https 将身份验证令牌传输到您的服务器

访问令牌的共享我们的数据政策明确禁止将您的应用程序的访问令牌与任何其他应用程序共享。但是,我们确实允许开发人员在同一应用程序的本机实现和服务器实现之间共享令牌(即使用相同的应用程序 ID),只要使用 HTTPS 进行传输即可。


C
Community

我可以看到这个策略的一个问题是,有人可以给你一个为不同的 facebook 应用程序获得的访问令牌。据我所知,无法验证访问令牌是否适用于您的应用程序,因此您只需继续使用它即可。

不过,这听起来并不是很有害。通常人们/应用程序会尝试保护访问令牌,而不是共享它们。

一种可能的利用是,某人创建自己的网站或移动应用程序,为他们的用户获取访问令牌并尝试使用您的 API 对他们进行身份验证。如果成功(用户在您的站点中有一个 facebook 帐户),恶意站点将能够使用您的 API 模拟用户。

这有点远,但我认为它可以工作。

编辑:看起来毕竟有一种方法可以验证访问令牌。请参阅@Daaniel 对问题 Get application id from user access token (or verify the source application for a token) 的回答。


发送 appsecret_proof 应该可以防止这种情况发生(参见 here
@Tony 你能解释一下 appsecret_proof 在这里有什么帮助吗?据我了解,它可以向 Facebook 证明服务器知道密钥。但是,ivant 指的是恶意应用程序获取令牌,然后将它们发送到您的 API。服务器可以验证app ID,但是app ID很容易被恶意app欺骗。那么......如何减轻这种情况?
您可以通过返回应用 ID 的 https://graph.facebook.com/app/?access_token=[user_access_token] 验证是否为您的应用生成了令牌,然后比较应用 ID
h
hamsterdam

您的解决方案完全有效。

也许是另一种选择:为什么不从最初的社交服务请求中获取客户端上的电子邮件并发送到您的 Web 服务? Web 服务可以只存储电子邮件,也可以存储一个 social_provider。我了解您的网络服务将无法验证电子邮件的来源,但您的网络服务与您的客户之间是否存在高度信任关系?如果有,似乎您可以依赖来自正确位置的电子邮件。有人请让我知道我遗漏了什么明显的东西,这使得基于电子邮件的方法变得愚蠢......


我可以很容易地找出客户端是如何与服务器对话的。然后我可以向它发送电子邮件,直到我受到打击。总是需要某种形式的验证
高度信任和客户?请不要在同一个句子中。当然,前一句除外。