如何允许移动应用程序使用 Facebook 登录并 Google 访问 GAE 上的网络服务?

How to allow mobile apps to login with Facebook and Google to access web service on GAE?

这与 有关。

我已经阅读了很多关于如何最好地为访问我的 Web 服务 运行 的移动应用程序用户(iOS 和 Android)登录 [=66] =] 应用引擎。我仍然不清楚如何最好地做到这一点,因为我想同时提供 Google 和 Facebook 登录。该应用程序和网络服务对 Facebook 或 Google 没有任何作用,除了我想借用他们的登录信息。

仅使用 Google 登录 GAE 非常简单,使用 OpenIDConnect 也是如此。很遗憾,Facebook 不支持此功能。

阅读 old question here on SO 有人想和我做同样的事情看起来应用程序应该做 Facebook 登录,然后得到一个令牌,它传递到我的后端,需要通过联系 Facebook 来验证。今天是怎么做到的?

我还找到了Google Identity Toolkit,这似乎是我需要的。但是,我没有网站或只有应用程序。我需要让应用程序执行 Facebook 登录,并以某种方式为我的网络服务提供一些东西,以便它可以验证登录信息。

稍后,应用程序用户应该能够使用随机 Facebook、Google 和我的自定义 username/password 登录。应用程序和 Web 服务应该知道用户已登录并授权它访问 REST API.

我该如何做到这一点?顺便说一句,我在 GAE 上使用 Go。

如果有人可以解释是否有多种选择、优缺点,并概述最佳方法和需要完成的工作,我将不胜感激。

非常感谢您对此提供的任何帮助!

更新

好的,非常感谢大家的帮助和指点。我的 GAE 后端已成功 运行 quickstart sample app for iOS。基本上,在我的 GAE 网络服务上创建了一个 Facebook 应用程序和权限凭据,以便示例 iOS 应用程序可以登录。

我在数据存储区中拥有经过身份验证的用户并且可以授权连续的 API 调用之前还有一点差距。

此时主要未解决的问题:

  1. 如何在Facebook或Google登录成功后在iOS应用程序中获取gtoken?
  2. 我应该在我的网络服务上显式调用 API 来传递 gtoken 还是在启用 Gitkit API 的情况下以某种方式自动进行?

感谢您的帮助!

更新

为了自己回答#1 和#2,可以在应用程序引擎配置中提供一个 "successful sign-in url",以便应用程序知道在哪里调用 gtoken。然后就像答案中解释的那样。

看起来您在 GAE 上有一个应用程序和一个后端。 如果您正在使用 google 身份工具包,它将允许您使用 Facebook、Google 和 email/password.

登录

当用户使用身份工具包成功登录到您的应用程序时,您的服务器应该会收到一个 gtoken。您在这里有两个选择:

  1. 将 gtoken 传递到您的应用程序并将其保存在那里。当您的应用对后端进行 API 调用时,您的应用应将 gtoken 附加到每个请求。您的后端应该为每个需要授权的 API 验证 gtoken(https://developers.google.com/identity/toolkit/web/required-endpoints)。
  2. 验证 gtoken,生成一个令牌,您的后端可以 recognize/identify 用户。然后将令牌传递给您的应用程序,其他一切都与选项 1 相同。

如果您不想使用身份工具包,您可以在您的 app/backend 上实现 facebook 登录并使用 facebook 令牌在您的应用程序和后端之间进行通信。

无论您的决定是什么,使用您 API 的应用程序都应该向您传递您的后端可以 recognize/authorize 用户的东西。

答案是关于使用 Google Identity Toolkit (GIT)。 GIT 本身是一个身份提供者,它将与您的应用 后端集成。流程沿着这些方向进行:

  • 您的应用通过其 GIT API
  • 请求登录
  • GIT 将执行与 Facebook 或其他第三方提供商的联合登录(对您的应用程序透明)和 returns GIT token 到应用程序(代表您的唯一用户)端到端系统视角,即应用加后端)
  • 应用程序向后端发出请求,并在其中传递 GIT 令牌
  • 后端验证 GIT 令牌的有效性(例如,使用 this go GIT client API)并从中提取用户身份,从而验证请求

您可以在 the backent endpoint doc 中找到有关后端令牌验证的更多详细信息,特别是查找这些部分:

  • 了解身份工具包cookie/token
  • 为用户获取信息

现在后端的实际令牌验证可能需要几秒钟,因此可能对来自应用程序的每个 REST 请求都执行此操作不切实际。如果是这样,您需要以某种方式:

  • 保存该特定应用实例的用户信息 在您的应用程序和后端
  • 之间管理的 "session" 之类的东西中进行身份验证
  • 将后端收到的特定 REST 请求映射到经过身份验证的特定 "session"

但我不确定这个 "session" 功能在 apps+backend 上下文中究竟是如何完成的,我还没有编写任何应用程序。