我想避免使用 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 应用程序中,最大的用户退出发生在网络视图屏幕上)。