2014-03-03 44 views
35

最近,我一直在使用Android上的Google API,特別是Analytics,AdSense和Tasks API進行了大量工作。訪問Google API - GoogleAccountCredential.usingOAuth2 vs GoogleAuthUtil.getToken()

我已經看到由谷歌提供一些樣品,他們用這個語句來獲得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);

我很困惑要使用哪一個在的情況和原因。我一直在使用方法編號。 1成功,並且不需要持續偏好令牌(我猜這是由GoogleAccountCredential自動完成)的

  1. 誰能告訴我,爲什麼會有人使用第一種方法,而不是第二個?

  2. 我怎樣才能訪問身份驗證令牌在第一種方法?

回答

40

Google APIs Client Library for Java正如其名稱暗示用於訪問Google API的庫一樣,它可用於多種平臺,如Java(一般)和Android,而Google Play ServicesGoogleAuthUtil僅適用於Android。

通過查看項目的wiki page就很難理解谷歌API客戶端庫如何與GoogleAuthUtil因爲維基表明AccountManager用於處理谷歌帳戶,它並沒有真正提GoogleAuthUtil可言。

但是如果你深入到代碼和問題跟蹤了一下,你可以看到你tasks sample自從谷歌API客戶端庫的鏈接version 1.12.0實際上uses GoogleAuthUtil當GoogleAuthUtil支持是added

維基可能提及AccountManager而不是GoogleAuthUtil,因爲這是在GoogleAuthUtil可用之前進行OAuth2身份驗證的方式,也是因爲維基的那部分尚未更新。

有關的AccountManager和GoogleAuthUtil之間請參閱差異的詳細信息:In a nutshell what's the difference from using OAuth2 request getAuthToken and getToken

總之谷歌API客戶端庫是與谷歌的服務交互和Android版本通過使用GoogleAuthUtil實現的跨平臺庫。

誰能告訴我,爲什麼會有人使用第一種方法,而不是第二個?

理由使用谷歌API客戶端庫

  • 如果是比Android不能使用GoogleAuthUtil,因爲它是一個Android特定庫的一些其他平臺的開發者。
  • 如果您正在開發跨平臺應用程序,則可以在您的共享代碼中使用Google API客戶端庫,以用於Android和其他平臺。
  • 如果您與Google的許多服務有很多交互,此庫可能會讓您的工作更輕鬆。
  • 如果您已經在使用它並且它按照想要的方式工作,那麼繼續使用它並沒有任何缺點,因爲它是GoogleAuthUtil的包裝器,所以與使用AccountManager或某個其他庫相比,您可以獲得GoogleAuthUtil的所有優點在AccountManager上。

理由使用GoogleAuthUtil

  • 使用這種需要比谷歌沒有其他庫或外部依賴性播放服務
  • 您的應用程序的足跡應該是較小的,因爲你沒有包括附加庫。
  • 如果您與Google的互動有限,直接使用GoogleAuthUtil可能會更容易,而不是直接使用另一個庫。
  • GoogleAuthUtil應該不會那麼難用,所以使用一個包裝它來簡化它的庫可能不會那麼容易使用。

我很困惑在哪個場景以及爲什麼使用哪一個。我一直在使用方法編號。 1成功...

如果您使用的是Google API客戶端庫,並且它可以正常工作,我看不出有什麼理由不應該繼續使用它。

但是,如果我要創建需要與Google服務交互的Android(僅)應用程序,我可能會直接使用GoogleAuthUtil。

...無需持續偏好令牌(我猜這是由GoogleAccountCredential自動完成)

是的,我這個被GoogleAuthUtil這又被GoogleAccountCredential使用的是自動處理。

如何在第一種方法中訪問身份驗證令牌?

您應該能夠調用GoogleAccountCredential對象上的方法getToken()

+1

感謝您的詳細解答!這個答案應該被賞金接受! –

+0

感謝您的回答。我接受了。 –

+0

其中的一個還會返回刷新令牌嗎?例如谷歌驅動器? –

2

方法頭號(com.google.api.client.googleapis.extensions.android.gms.auth。*)是谷歌的更一般的,跨平臺的客戶管理流程的一部分,而方法二號(COM .google.android.gms.auth.GoogleAuthUtil)是特定的Android。它看起來像各種Android的Google API,方法二,包裝和簡化方法一。例如,the Google+ documentation, second paragraph指出:「Google+登錄按鈕對用戶進行身份驗證並管理OAuth 2.0流量,這簡化了您與Google API的集成。」

我會盡量使用Android的具體方法,token = GoogleAuthUtil.getToken(mActivity, mEmail, mScope),

+0

'方法一(com.google.api.client.googleapis.extensions.android.gms.auth。*)是Google更一般的跨平臺賬戶管理流程的一部分!怎麼會這樣?軟件包名稱本身在路徑中包含android ...您可能想要編輯您的答案... – nightlytrails

+0

「com.google.api.client.googleapis.extensions.android.gms.auth。*'包定義了」GoogleAccountCredential「類,它處理OAuth2.0,只是一個'GoogleAuthUtil'的包裝,附帶'Google Play Services' SDK for android ..您可能想要編輯您的答案... – nightlytrails

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令牌。

爲了獲得一個令牌,您可以 -

  • 直接使用來自谷歌API客戶端庫中的OAuth 2.0庫爲Java(不推薦用於Android系統)

  • 或利用的認證部Google Play服務庫使用GoogleAuthUtil和AccountPicker。 Read Authorizing with Google for REST APIs.GoogleAuthUtil.getToken())(GoogleAuthUtil.getToken()緩存並管理令牌過期並自行刷新。但是,如果發生網絡錯誤/服務器負載,則可能需要在重試令牌之前使用指數退避算法,以免服務器滿足請求的要求。)

  • 或使用GoogleAccountCredential打包在google-api-client-android-1.19.0.jar附帶Google API客戶端庫用於Java。該軟件包提供基於Google Play服務客戶端庫GoogleAccountCredential is just a wrapper周圍的GoogleAuthUtilAccountPicker。這將允許您使用相同的一致性授權流程和來自Google Play服務客戶端庫的標準帳戶選擇器對話框,同時將令牌管理委託給GoogleAccountCredential。以this爲例。