30

I'm building an application with the following blocks:

Android - Client Side, Java Servlets - Sever Side, Facebook app - used in order to authenicate users and work with their data.

My Problem is the following: I would like to authenticate my users via facebook (such as a request sent from the android client using facebook-android-sdk to facebook) but then I would like to send requests to my server (which is implemented by servlets) and to validate somehow that the user sending the request is authenticated to facebook and my application.

So these are the steps:

user X is authenicated to facebook and my facebook app using facebook-android-sdk. X is sending a request to my server

As for the server, I would only like to know it's a proper user which is working with me, I don't need the server to perform any Graph API requests.

How can I know that X is valid in my server? The authentication was performed on client side in that case.

4

2 回答 2

58

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

我解决了这样的问题:

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

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

于 2011-12-09T09:30:19.993 回答
12

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

  1. 从 Android 应用程序进行身份验证
  2. 从应用中的身份验证中获取 FB Auth 令牌
  3. 将令牌和 fb UID 转发到 Web 服务器
  4. 调用此处描述的调试端点(https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling) - 这将为您提供生成的应用程序的应用程序 ID令牌。确保应用程序 ID 是您的应用程序 ID(意味着它是来自您的移动应用程序的令牌),否则有人正在使用来自另一个应用程序的令牌劫持您的应用程序,并且您正在泄漏用户数据(正如 thomas tunkl 用 url https 指出的那样: //developers.facebook.com/docs/facebook-login/security/#tokenhijacking)。那很不好。还要检查 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 用户的有效令牌;意味着他们已经正确地进行了身份验证。

于 2018-01-23T08:53:47.600 回答