我正在尝试使用OAuth 1.0a将Android应用程序迁移到OAuth 2.0.(根据我的OAuth 2.0需要使用适用于Java/Android的Google API客户端库).
在Android平台上使用OAuth 2.0访问Google API的最佳/首选解决方案是什么,同时考虑了可用性方面.用户应该能够以简单的方式自动化访问,与我的Android应用程序无缝集成.
该应用程序当前正在使用OAuth 1.0基于Web的流程,我的应用程序弹出浏览器以允许用户授权访问,并且使用自定义重定向URI,我的应用程序能够检索访问令牌.它工作得很好,但我不喜欢这样的事实,我需要离开我的应用程序才能弹出一个浏览器来显示一个网页.我当时认为OAuth 2.0可以解决这个问题,并提供更好的用户体验.
我开始关注Google IO中概述的Adroid AccountManager-OAuth2集成,因为它不涉及webbrowser,并且与Android更紧密地结合,但它根本不按预期的方式运行.它没有记录,也不清楚它是否仍然是未来可行的选择.
我现在开始研究标准的OAuth 2.0 Web流程.
在这里,我似乎有两个选择:
将OAuth 2.0客户端配置为已安装的应用程序,并使用urn:ietf:wg:oauth:2.0:oob重定向URI.
不是很干净的解决方案,因为我不会让我的用户将一些代码复制粘贴到我的应用程序中.这根本不是用户友好的.
在使用OAuth 2.0访问谷歌的API文档提到,有投票的某种方式的页面解析出URL的冠军,但我也看到了很多与可用性问题,并没有真正想写这种管道代码.如果存在可以为我做的那个客户端库,我会很乐意进一步调查,但是现在,我已经放弃了这个选项.
将OAuth 2.0客户端配置为webapp,并使用重定向URI.
在这里,我注意到OAuth 2.0中禁止使用非标准方案.以前,可以使用类似xoauth://回调的东西,但不再允许这样做.在配置像http://mysite.com/oauth2/callback这样的重定向URI时,我无法在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页面重定向到同一个网址时,它只会显示在浏览器中.
即使这样可行,用户仍会看到一个选择器弹出窗口(在浏览器中打开或使用我的Android Activity打开).从可用性的角度来看,这也是不可接受的.
我正在寻找比这里概述的解决方案更好的解决方案.
此致,戴维
我最终使用WebView组件加载了Google授权网址.使用WebviewClient,我能够拦截加载到Webview中的页面,因此,当用户接受或拒绝授权请求时,我能够继续流程.
如果用户接受,则Google重定向到的网址包含"代码"请求参数,并且应用程序可以将其替换为OAuth 2.0令牌.如果用户不接受,则Google重定向到的URL包含"错误"请求参数,并且应用程序可以处理不满意的情况.
我在博客文章中写下了所有内容:Android中的Oauth 2.0流程
该帖子还包含使用带有Latitude API的OAuth 2.0流程的示例Android应用.示例代码在GitGub中提供.