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

Phi*_*ods 29 android facebook servlets facebook-android-sdk

我正在使用以下块构建应用程序:

Android - 客户端,Java Servlets - Sever Side,Facebook应用程序 - 用于验证用户和处理他们的数据.

我的问题如下:我想通过Facebook验证我的用户(例如从Android客户端使用facebook-android-sdk发送到facebook的请求),但后来我想向我的服务器发送请求(由servlets)并以某种方式验证发送请求的用户是否已通过Facebook和我的应用程序验证.

所以这些是步骤:

用户X使用facebook-android-sdk验证到Facebook和我的Facebook应用程序.X正在向我的服务器发送请求

至于服务器,我只想知道它是一个正在使用我的用户,我不需要服务器来执行任何Graph API请求.

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

Mik*_*nen 58

所以你有:Facebook - Android应用程序 - 您的Web服务器.并且您的Web服务器需要知道您是您正在呈现的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身份验证是真实的)

  • 嗨,对于正在寻找相同用户流的任何人.这是不正确的.请参阅:https://developers.facebook.com/docs/facebook-login/security/#tokenhijacking此解决方案的问题是,我可以使用access_token调用您的API,用户提供给我的应用程序并在您的应用程序中使用它. (10认同)

Hal*_*yon 8

这个问题的更好答案(包含来自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(意味着它是来自您的移动应用程序的令牌),否则有人使用来自其他应用程序的令牌劫持您的应用程序并且您正在泄漏用户数据(正如托马斯tunkl指向的网址为https: //developers.facebook.com/docs/facebook-login/security/#tokenhijacking).那很不好.同时检查is_valid/expires_at以确保它仍然是您应用中的有效令牌.

(因为我链接了文档,我还将从这里的调试和错误处理链接中提取一些信息,以显示如何进行调用以及您获得的内容:)

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

要使用API​​,您可以发出图表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 } }

请注意,对于短期访问令牌,不会返回issued_at字段.

这将确保您拥有从用户自己的密钥生成的Facebook用户的有效令牌; 意味着他们已经正确认证.