1

我想避免使用 WebViews 从 Google 获取 OAuth 令牌。(要求用户分享他的联系人、个人资料信息等)。为此,我使用了Google Play Services API

由于我的应用程序是基于云的(逻辑发生在云中),我必须将这些令牌保存在云中。我还必须让用户从多个设备登录(每次他从新设备登录时都不需要询问他的 Google 权限)

我试图实现这个谷歌博客中提到的技术。

我尝试了博客中提到的方法。它并没有完全按照我的意愿工作。我还检查了 +Tim Bray 的 Google 代码项目(favcolor-accountchooser),它有以下代码。

        try {
            // if this works, token is guaranteed to be usable
            token = GoogleAuthUtil.getToken(FavColorMain.this, mEmail, SCOPE);

        } catch (UserRecoverableAuthException userAuthEx) {
            startActivityForResult(userAuthEx.getIntent(), AUTHUTIL_REQUEST_CODE);
            token = null;

        }

它与博客中提到的概念相冲突。获得的“令牌字符串”不会发送回服务器,并且在异常块中,会向用户询问进一步的权限(范围)。这个片段意味着什么?

另外,“网络应用程序”一直以来的作用是什么?除了在范围参数中提到之外,我认为它没有任何用处。

另一个重大问题

例如,我的应用程序从多个 Google ID 获取联系人权限,然后合并重复项并提供统一的联系人列表。现在,所有的魔法都发生在服务器中,而服务器就是需要令牌的人。

我的 Android 应用使用 Google Play 服务 API 并获取多个 Google 帐户的用户权限(以读取联系人)。如何将令牌传递给我的网络应用程序(仅通过 https 连接?)。一旦用户授予Android应用程序(在同一项目下)的权限,同一项目下的Web应用程序就不能获得这些令牌吗?

如果现在我在另一部 Android 手机上安装相同的应用程序,我必须再次要求用户授予我访问每个帐户的联系人的权限(即使他之前已授予我权限),因为没有实际的概念'在此登录。所有令牌都必须从移动设备发送到服务器。

替代方案:我必须使用 Web 视图并直接获取云应用程序的令牌,而不是使用 Google Play 服务 SDK,这很不直观。(在我们的 +Friday 应用程序中,最大的用户退出发生在网络视图屏幕上)。

4

1 回答 1

1

实际上,如果仔细观察,令牌值会传递给 mCustomer.execute(),例如在 Fetcher.java 中,它会将其打包成一些 JSON,然后通过 POST 将其发送到后端。“Web 应用程序”应该是您要将 ID 令牌发送到的后端的注册客户端 ID。

是的,您可以将令牌传递给您的 Web 应用程序并在后端使用它们。记住在做这种事情时使用 HTTPS。

我们正在努力使批准更具粘性,因此,如果您在一个 Android 上为特定用户/范围组合获得它,它也应该适用于其他 Android。请参阅https://developers.google.com/accounts/docs/CrossClientAuth

于 2013-05-21T17:45:20.537 回答