访问Google API - GoogleAccountCredential.usingOAuth2与GoogleAuthUtil.getToken()

Mad*_*uja 38 android google-api oauth-2.0 google-api-java-client

最近,我一直在使用Android上的Google API,特别是Google Analytics,AdSense和Tasks API.

我见过Google提供的一些示例,他们使用此语句获取GoogleAccountCredential对象

https://code.google.com/p/google-api-java-client/source/browse/tasks-android-sample/src/main/java/com/google/api/services/samples/tasks/android/ TasksSample.java?repo=samples

credential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS));

但是,如果我查看以下文档:
http://developer.android.com/google/auth/http-auth.html
http://developer.android.com/google/play-services/auth.html

他们都提到了下面用于获取令牌的方法:
token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope);

我很困惑在哪种场景中使用哪一个以及为什么.我一直在使用Method no.1成功而无需在首选项中保留令牌(我猜这是由GoogleAccountCredential自动完成的)

  1. 任何人都可以告诉我为什么有人会使用第一种方法而不是第二种方法?

  2. 如何在第一种方法中访问身份验证令牌?

nib*_*ius 44

谷歌API客户端库的Java是顾名思义库访问谷歌的API,它是适用于多个平台,如Java(一般)和Android,而谷歌播放服务GoogleAuthUtil仅适用于Android.

通过查看项目的Wiki页面,很难理解Google API客户端库与GoogleAuthUtil的关系,因为维基建议使用AccountManager来处理Google帐户,而且根本没有提到GoogleAuthUtil.

但是,如果您深入研究代码及其问题跟踪器,您可以看到,自添加了对GoogleAuthUtil的支持以来,您链接的任务样本实际上使用了Google API Client Client库的1.12.0 版以后的GoogleAuthUtil .

维基可能会提到AccountManager而不是GoogleAuthUtil,因为这是在GoogleAuthUtil可用之前进行OAuth2身份验证的方式,因为该部分维基尚未更新.

有关AccountManager和GoogleAuthUtil之间差异的更多信息,请参阅:简而言之,使用OAuth2请求getAuthToken和getToken的区别是什么

简而言之,Google API客户端库是一个用于与Google服务交互的跨平台库,Android版本是使用GoogleAuthUtil实现的.

任何人都可以告诉我为什么有人会使用第一种方法而不是第二种方法?

使用Google API客户端库的原因

  • 如果您正在开发Android以外的其他平台,则无法使用GoogleAuthUtil,因为它是Android特定的库.
  • 如果您正在开发跨平台应用程序,则可以在共享代码中使用Google API客户端库,以用于Android和其他平台.
  • 如果您与Google的许多服务进行了很多互动,那么这个库可能会让您更轻松.
  • 如果您已经在使用它并且它按预期工作,那么继续使用它并没有任何缺点,因为它是GoogleAuthUtil的包装器,因此与使用AccountManager或基于AccountManager的其他库相比,您可以获得GoogleAuthUtil的所有优势.

使用GoogleAuthUtil的原因

  • 使用此功能不需要其他库或外部依赖项,而不是Google Play服务
  • 您的应用程序的占用空间应该更小,因为您不必包含其他库.
  • 如果您与Google的互动受到限制,可能更容易直接使用GoogleAuthUtil,而不是通过其他图书馆.
  • GoogleAuthUtil不应该那样难以使用,因此使用包围它的库来简化它可能不会那么容易使用.

我很困惑在哪种场景中使用哪一个以及为什么.我一直在使用Method no.1成功...

如果您使用的是Google API客户端库,它可以正常使用,我看不出您不应该继续使用它的任何理由.

但是,如果我要创建一个需要与Google服务进行交互的Android(仅限)应用程序,我可能会直接使用GoogleAuthUtil.

...无需在首选项中保留令牌(我猜这是由GoogleAccountCredential自动完成的)

是的,我这是由GoogleAccountCredential反过来使用的GoogleAuthUtil自动处理的.

如何在第一种方法中访问身份验证令牌?

您应该能够在对象上调用方法getToken()GoogleAccountCredential.


nig*_*ils 9

Google Play Services client library 专为Android设备编写,可提供与各个Google服务的无缝集成以及一致的用户界面,以获取用户授权以使用其凭据访问这些服务.

Google APIs Client Library for Java 是从所有应用程序类型(Web,已安装或Android应用程序)访问Google服务的通用库.

回到Android,如果您要使用的Google API未包含在内,则Google Play services library可以使用相应的REST API进行连接,但必须获取OAuth 2.0令牌.

要获得令牌,您可以 -

  • 直接使用来自Google API Client Library for Java的OAuth 2.0库(不适用于Android)

  • 或使用GoogleAuthUtil和AccountPicker 利用Google Play服务库的授权部分.阅读Google使用REST API授权.(GoogleAuthUtil.getToken()缓存和管理令牌到期并刷新自身.但是,如果出现网络错误/服务器负载,您可能需要在重试令牌之前使用指数退避算法,以免使请求泛滥服务器.)

  • 或使用Google API Client Library for Java附带的GoogleAccountCredential打包.该软件包提供了一个基于实用工具谷歌Play服务客户端库和各地和.这将允许您在将令牌管理委派给的时使用相同的一致授权流程和Google Play服务客户端库中的标准帐户选择器对话框.请参阅示例.google-api-client-android-1.19.0.jarGoogleAccountCredential is just a wrapperGoogleAuthUtilAccountPickerGoogleAccountCredential