安卓:Google SSO - OAuth 还是 AccountManager?还是两者都要用?

10
阅读了各种Stackoverflow帖子和各种文档,包括http://code.google.com/p/google-api-java-client/网站上的一些文档后,我感到非常困惑。那么,有人能解释一下实现以下目标的最佳方法吗:
  1. 让用户批准我的应用程序。我并不在乎是通过访问他们在账户/设置中注册的 Google 帐户并批准该应用程序(首选方式),还是通过调用 Google OAuth 认证页面来完成的。
  2. 获取可用于与 Google Reader 通信的身份验证令牌。
对我另一个困惑的地方 - 我能够使用AccountManager批准我的应用程序并从中获取授权令牌,但无法与Google Reader一起使用。所以如何平衡AccountManager中的帐户信息和OAuth?在AccountManager设置中获得用户批准后,我是否仍然需要在OAuth中做任何事情?
代码示例很好,但我更希望有人能为我清楚地解释所有这些部分之间的关系。

“批准”您的应用是什么意思?您是否寻求在您的应用中使用他们的身份(OpenID),或者让您的应用程序通过Google访问用户数据(OAuth)? - Anirudh
公平的问题。在这种情况下,我想能够使用用户手机上注册的Google帐户登录到他们的Google阅读器帐户。或者(如果不可能),我不介意(但不愿意)最初将用户重定向到Google OAuth应用程序批准页面。 - Bostone
从 Google Reader 帐户中检索信息的实际操作由远程服务器完成,应用程序只需要传递适当的身份验证令牌。 - Bostone
2个回答

6
账户管理器允许您获取不同服务的身份验证令牌。在幕后有不同的具体实现:ClientLogin,OAuth等。要使其与Google Reader等服务配合使用,您需要传递适当的令牌类型。对于ClientLogin,这些是短字符串,例如“ah”(App Engine)和“reader”(Google Reader)。对于OAuth,它们是由每个服务定义的范围。因此,您将作为authTokenType参数传递什么?获取令牌是异步的,因为它可能涉及网络访问。如果存在缓存的令牌且有效,则会立即返回。流程并不复杂,请参阅上面的链接以获得漂亮的图片。一旦获得令牌,您将其放入适当的标头中,并根据规范使用API。

正如我所说,我更喜欢使用用户现有的 Google 帐户进行签名。是否有关于这些“短字符串”的文档,概述了支持什么? - Bostone
正确的术语实际上是“服务名称”。这不是一个完整的列表,但这里有大部分:http://code.google.com/apis/gdata/faq.html#clientlogin。关于身份验证到Google服务的一般信息,您可能想从这里开始:https://developers.google.com/accounts/。Android的AccountManger只是这些的前端。 - Nikolay Elenkov
谢谢Nikolay。我接受了你的答案,因为我相信在这一点上我可以弄清楚剩下的部分。 - Bostone
我认为我现在使用这种方法遇到的问题是,Reader仍然没有官方API。因此,我无法使用Google控制台指定我的API密钥,只能获得只读访问权限。因此,我将为此创建另一个问题。 - Bostone
这里有一个,但它不是官方的:http://code.google.com/p/google-reader-api/ 这也可能有帮助,它有一些Android特定的代码,但据我所知,没有支持Reader:http://code.google.com/p/google-api-java-client/ - Nikolay Elenkov

4
这里有一门关于AccountManager的Android培训课程,可能会对您有所帮助:http://developer.android.com/training/id-auth/authenticate.html。此外,与Google Reader结合使用AccountManager目前是唯一优选的方法。通过WebView引导用户进入登录页面不太安全,并且据我所知,使用浏览器不受Google API支持(我也不确定Reader是否使用OAuth2)。

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