在Android上使用OAuth 2.0最佳方式使用Google APIs

5
我正在尝试将一个使用OAuth 1.0a的Android应用迁移到OAuth 2.0。 (对于我的OAuth 2.0需求,使用Google API客户端库进行Java / Android)。在考虑可用性方面,什么是在Android平台上使用OAuth 2.0访问Google API的最佳/首选解决方案?用户应该能够轻松授权访问,并与我的Android应用程序无缝集成。该应用程序目前正在使用基于Web的OAuth 1.0流程,其中我的应用程序弹出浏览器以让用户授权访问,并使用自定义重定向URI,我的应用程序能够检索访问令牌。它工作得很好,但我不喜欢我需要离开我的应用程序来弹出浏览器显示网页的事实。我想OAuth 2.0可能会解决这个问题,并提供更好的用户体验。
我开始研究Google IO中概述的Adroid AccountManager-OAuth2集成,因为它不涉及Web浏览器,与Android更加紧密地耦合在一起,但它并没有按照应有的方式工作。它没有文档说明,并且不清楚它是否将来仍然是一个可行的选择。
现在,我开始调查标准的OAuth 2.0 Web流程。
这里似乎有两个选项: 将OAuth 2.0客户端配置为已安装的应用程序,并使用urn:ietf:wg:oauth:2.0:oob重定向URI。 这不是一个很干净的解决方案,因为我不会让我的用户将一些代码复制粘贴到我的应用程序中。这完全不用户友好。

使用OAuth 2.0访问Google APIs文档提到有一种轮询页面标题来解析URL的方法,但我认为这样会带来很多可用性问题,并且不想编写此类代码。如果存在客户端库可以为我完成此操作,我将很乐意进一步研究,但目前,我已放弃了此选项。

将OAuth 2.0客户端配置为Web应用程序,并使用重定向URI。

在这里,我注意到OAuth 2.0中禁止使用非标准方案。以前,可以使用类似于xoauth://callback的东西,但现在不允许了。 当配置重定向URI时,例如http://mysite.com/oauth2/callback,尽管已经为其设置了正确的意图过滤器,但在Google OAuth 2.0页面重定向时,我无法让Android打开我的活动。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活动打开)。从可用性角度来看,这也是不可接受的。

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

谢谢, Davy

2个回答

13
我最终使用了一个WebView组件来加载Google授权URL。 通过使用WebviewClient,我能够拦截加载到WebView的页面,因此当用户接受或拒绝授权请求时,我能够继续流程。
如果用户接受,被Google重定向的URL中包含一个“code”请求参数,应用程序能够用它交换OAuth 2.0令牌。 如果用户不接受,被Google重定向的URL中包含一个“error”请求参数,应用程序可以处理这种不愉快的情况。
我已经把所有内容写在博客文章中:Android中的Oauth 2.0流程
这篇文章还包含了一个使用Latitude API实现OAuth 2.0流程的示例Android应用程序。示例代码位于GitHub上

我刚刚用Picasa示例测试了AccountManager。你提到的视频(Google I/O 2011)似乎是一个很好的起点。Picasa的例子对我来说很不错。目前我还没有使用过OAuth 2 / AccountManager。但是看了Picasa源代码,我认为它并不难懂。你试过吗? - user942821
它应该可以工作,但在ICS之前,授权屏幕并不是真正用户友好的。它列出了原始的Oauth2范围。在ICS中,它有人类可读的名称。但您无法获得与基于Web的方法相同的品牌(应用程序图标)。 https://plus.google.com/u/0/112215288642007559493/posts/Zme5LNLwCDP - ddewaele
如果你的应用程序已经上市了,能否请告诉我它的链接?如果这是一个私人问题,我很抱歉,你可以拒绝,我会理解的... - user942821

2

Play Services是在2013年的Google I/O大会上推出的,现在已经成为Android中使用OAuth2的官方方式,不需要WebView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接