Facebook 使用 Android 对我的服务器进行身份验证

Posted

技术标签:

【中文标题】Facebook 使用 Android 对我的服务器进行身份验证【英文标题】:Facebook authentication to my server using Android 【发布时间】:2011-12-07 02:21:26 【问题描述】:

我正在构建一个包含以下块的应用程序:

android - 客户端, Java Servlets - 服务器端, Facebook 应用 - 用于对用户进行身份验证并处理他们的数据。

我的问题如下: 我想通过 facebook 对我的用户进行身份验证(例如使用 facebook-android-sdk 从 android 客户端发送到 facebook 的请求),但是我想将请求发送到我的服务器(由 servlet 实现)并以某种方式进行验证发送请求的用户已通过 facebook 和我的应用程序的身份验证。

以下是这些步骤:

用户 X 使用 facebook-android-sdk 对 facebook 和我的 facebook 应用程序进行了身份验证。 X 正在向我的服务器发送请求

至于服务器,我只想知道它是与我一起工作的合适用户,我不需要服务器来执行任何 Graph API 请求。

我如何知道 X 在我的服务器中有效?在这种情况下,身份验证是在客户端执行的。

【问题讨论】:

【参考方案1】:

所以你有:Facebook - Android 应用程序 - 你的网络服务器。您的网络服务器需要知道您是您所展示的 Facebook 用户。问题是您不能信任 Android 客户端提供给您的任何数据。

我这样解决了这个问题:

    从 Android 应用程序向 Facebook 验证用户, 获取 FB 身份验证令牌到 android 应用程序, 将身份验证令牌和 facebook UID 从 Android 转发到 Web 服务器, 使用此处所述的 Facebook Graph 调试端点 (https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow#checktoken) 验证令牌(使用 app_id 和 user_id),以确保令牌适用于正确的应用程序 在 Web 服务器上,使用提交的令牌进行 Facebook API 调用。

如果来自您的网络服务器的调试端点 API 调用返回有效信息(应用 ID 和用户 ID),则您的服务器可以信任该 ID(并且您可以确定 Android 身份验证是真实的)

【讨论】:

那么,如果服务器必须做更多的工作,你怎么知道它是否已经过验证?从 android 应用程序向您的服务器发出请求,向一条表明它是否有效的路由发出请求? 嗨,对于正在寻找相同用户流的任何人。这是不正确的。看到这个:developers.facebook.com/docs/facebook-login/security/… 这个解决方案的问题是,我可以使用用户提供给我的应用程序的 access_token 调用你的 API,并在你的应用程序上使用它。【参考方案2】:

这个问题的更好答案(结合来自 tomas.tunkl 评论的信息)如下:

    从 Android 应用程序进行身份验证 从应用中的身份验证中获取 FB Auth 令牌 将令牌和 fb UID 转发到 Web 服务器 调用此处描述的调试端点 (https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling) - 这将为您提供生成令牌的应用程序的应用程序 ID。确保应用程序 ID 是您的应用程序 ID(意味着它是来自您的移动应用程序的令牌),否则有人正在使用来自另一个应用程序的令牌劫持您的应用程序并且您正在泄漏用户数据(正如 thomas tunkl 指出的 url @987654322 @)。那很不好。还要检查 is_valid/expires_at 以确保它仍然是来自您的应用的有效令牌。

(由于我链接了文档,因此我还将在此处从调试和错误处理链接中提供一些信息,以展示如何进行调用以及返回的内容:)

使用访问令牌时,您可能需要检查与其关联的信息,例如其用户或到期时间。要获取此信息,您可以使用我们的调试工具,也可以使用 API 端点。

要使用 API,您可以发出 Graph API 请求:

GET /debug_token? input_token=input-token& access_token=access-token

input_token:要获取相关信息的访问令牌

access_token:您的应用访问令牌或来自应用开发者的有效用户访问令牌 API 调用的响应是一个包含字段映射的 JSON 数组。例如:

"data": "app_id": 000000000000000, "application": "Social Cafe", "expires_at": 1352419328, "is_valid": true, "issued_at": 1347235328, "scopes": [ "email", "publish_actions" ], "user_id": 1207059

请注意,短期访问令牌不会返回 issue_at 字段。

这将确保您拥有从您自己的用户密钥生成的 Facebook 用户有效令牌;意味着他们已经正确地进行了身份验证。

【讨论】:

这是正确答案。不幸的是,原生 facebook SDK 似乎不支持生成服务器身份验证代码,这是这类事情的常见流程。 由于 cmets 非常有限,我不得不发一个新帖子,如果你能澄清你的 3) 和 4) 点***.com/questions/65479647/…,我将不胜感激***.com/questions/65479647/… accessToken中的userId可以做验证吗?因为该 userId 对于每个应用程序都是唯一的。如果我在另一个应用程序中使用 facebook 登录,他们将有不同的 userId。

以上是关于Facebook 使用 Android 对我的服务器进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 应用程序上使用 facebook 对服务器上的用户进行身份验证

Facebook SDK:发布到墙上只对我可见以用于测试目的?

Facebook API SDK撤销访问权限

从服务器获取用于发布到 Facebook 粉丝页面的持久令牌的步骤是啥

通过 Facebook 令牌从 Android 应用程序对 WebAPI 的身份验证访问

从我的应用程序中注销(使用 facebook android sdk 4.0 开发)并安装 facebook 原生应用程序