5

我正在尝试将使用 OAuth 1.0a 的 Android 应用程序迁移到 OAuth 2.0。(使用适用于 Java/Android 的 Google API 客户端库来满足我的 OAuth 2.0 需求)。

在考虑可用性方面的 Android 平台上使用 OAuth 2.0 访问 Google API 的最佳/首选解决方案是什么。用户应该能够以一种简单的方式自动访问,与我的 Android 应用程序无缝集成。

该应用程序当前正在使用基于 Web 的 OAuth 1.0 流程,其中我的应用程序弹出一个浏览器以让用户授权访问,并且使用自定义重定向 URI,我的应用程序能够检索访问令牌。它工作得很好,但我不喜欢我需要离开我的应用程序才能弹出浏览器来显示网页的事实。我在想 OAuth 2.0 可能会解决这个问题,并提供更好的用户体验。

我开始研究Google IO 中概述的 Adroid AccountManager-OAuth2 集成,因为它不涉及网络浏览器,并且与 Android 的耦合更紧密,但它根本没有按应有的方式工作。它没有记录在案,也不清楚它是否会在未来仍然是一个可行的选择。

我现在开始研究标准的 OAuth 2.0 网络流程。

在这里,我似乎有两个选择:

将 OAuth 2.0 客户端配置为已安装的应用程序,并使用 urn:ietf:wg:oauth:2.0:oob 重定向 URI。

不是很干净的解决方案,因为我不会让我的用户将一些代码复制粘贴到我的应用程序中。这根本不是用户友好的。

Using OAuth 2.0 to Access Google APIs docs提到有一些方法可以轮询页面的标题来解析URL,但我也看到了很多可用性问题,并且真的不想写这种管道代码。如果存在可以为我执行此操作的客户端库,我很乐意对此进行进一步调查,但目前我已放弃此选项。

将 OAuth 2.0 客户端配置为 webapp,并使用重定向 URI。

在这里,我注意到 OAuth 2.0 中禁止使用非标准方案。以前,可以使用 xoauth://callback 之类的东西,但现在不允许这样做了。在配置像http://mysite.com/oauth2/callback这样的重定向 URI 时,我无法让 Android 在 Google OAuth 2.0 页面重定向时打开我的活动,尽管已经为它设置了适当的意图过滤器。http://mysite.com/oauth2/callback只是显示在我的浏览器中。

以下确实有效

Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("http://mysite.com/oauth2/callback"));
startActivity(i);

但是当 Google OAuth 2 页面重定向到同一个 URL 时,它只是显示在浏览器中。

即使这可行,用户仍会看到一个选择器弹出窗口(在浏览器中打开或使用我的 Android 活动打开)。从可用性的角度来看,这也是不可接受的。

我正在寻找比此处概述的解决方案更好的解决方案。

问候,戴维

4

2 回答 2

13

我最终使用了一个 WebView 组件来加载 Google 授权 URL。使用 WebviewClient,我能够拦截正在加载到 Webview 中的页面,因此,当用户接受或拒绝授权请求时,我能够继续流程。

如果用户接受,Google 重定向到的 URL 将包含一个“代码”请求参数,并且应用程序能够将其交换为 OAuth 2.0 令牌。如果用户不接受,Google 重定向到的 URL 包含“错误”请求参数,应用程序可以处理不愉快的情况。

我在一篇博文中写下了所有内容:Android 中的 Oauth 2.0 flow

该帖子还包含一个使用 OAuth 2.0 流和 Latitude API 的示例 Android 应用程序。示例代码在 GitGub 中可用

于 2011-08-07T08:27:01.377 回答
2

Play 服务是在 2013 年 Google I/O 上推出的,现在是在 Android 中使用 OAuth2 的官方方式。它们不需要 WebView。

于 2013-10-08T14:49:24.267 回答