鍍金池/ 教程/ Java/ 谷歌應(yīng)用程序默認(rèn)憑證
本地安裝的應(yīng)用程序中使用 OAuth 2.0
設(shè)備中使用 OAuth 2.0
使用 OAuth 2.0 來(lái)訪問(wèn)谷歌 API
Web 服務(wù)器應(yīng)用程序中使用 OAuth 2.0
服務(wù)類(lèi)應(yīng)用中使用 OAuth 2.0
跨客戶端身份憑證
客戶端應(yīng)用程序中使用 OAuth 2.0
谷歌應(yīng)用程序默認(rèn)憑證

谷歌應(yīng)用程序默認(rèn)憑證

為調(diào)用谷歌應(yīng)用接口,谷歌應(yīng)用程序的默認(rèn)憑證提供了一個(gè)簡(jiǎn)單途徑來(lái)獲取授權(quán)證書(shū)。

他們有最適合這些事例的解決方案,當(dāng)應(yīng)用程序獨(dú)立于用戶去調(diào)用接口時(shí),需要擁有相同的的身份標(biāo)識(shí)和授權(quán)等級(jí)。這里推薦授予應(yīng)用調(diào)用谷歌云應(yīng)用接口的權(quán)限,特別是在你要發(fā)布到谷歌應(yīng)用引擎或者谷歌計(jì)算引擎虛擬機(jī)上的應(yīng)用程序時(shí)。

內(nèi)容

何時(shí)使用應(yīng)用程序的默認(rèn)憑證

出現(xiàn)下列任一情形時(shí),我們推薦你使用應(yīng)用程序的默認(rèn)憑證:

  • 你的代碼運(yùn)行在谷歌應(yīng)用引擎或者谷歌計(jì)算引擎上。當(dāng)部署應(yīng)用程序時(shí),其默認(rèn)憑證提供了訪問(wèn)內(nèi)置服務(wù)賬號(hào)的權(quán)限,但是也提供了部署之前,測(cè)試應(yīng)用程序時(shí)可供選擇的憑證。

  • 為避免在應(yīng)用程序代碼中嵌入的鑒定信息。通常一個(gè)最佳使用方式是,以避免包含密鑰認(rèn)證的相關(guān)源代碼,如測(cè)試和生產(chǎn)時(shí),需要在不同的上下文中使用不同的憑證。使用環(huán)境變量,在應(yīng)用程序外可以定義憑證。

  • 正在訪問(wèn)的應(yīng)用接口,其中的數(shù)據(jù)是關(guān)聯(lián)到一個(gè)云項(xiàng)目或整個(gè)應(yīng)用程序的,而不是個(gè)人用戶數(shù)據(jù)。所以最好使用一個(gè)認(rèn)證流程,最終用戶明確同意訪問(wèn)(查看 使用 OAuth 2.0 訪問(wèn)谷歌應(yīng)用接口)。

應(yīng)用程序的默認(rèn)憑證如何工作

通過(guò)調(diào)用客戶端代碼庫(kù),你可以獲取到應(yīng)用程序的默認(rèn)憑證。返回的憑證是由環(huán)境中運(yùn)行的代碼決定的。按照以下順序進(jìn)行檢查:

  1. 檢測(cè)環(huán)境變量 GOOGLE_APPLICATION_CREDENTIALS。如果環(huán)境變量是規(guī)定的,它應(yīng)該指明了定義憑證的文件。通過(guò)這個(gè)簡(jiǎn)單的方法可以獲取到憑證,其目的是使用 谷歌開(kāi)發(fā)者面板APIs & Auth 選項(xiàng)中的子選項(xiàng) Credentials 來(lái)創(chuàng)建一個(gè)服務(wù)帳戶。創(chuàng)建一個(gè)服務(wù)賬號(hào)或者選擇一個(gè)現(xiàn)存的,選中 Generate new JSON key 選項(xiàng)。為下載的 JSON 文件設(shè)置環(huán)境變量。

  2. 如果你在你的設(shè)備上安裝了谷歌云 SDK,需要運(yùn)行命令 gcloud auth login,你的身份可以用作代理,從那臺(tái)機(jī)器測(cè)試代碼調(diào)用應(yīng)用接口。

  3. 如果你的應(yīng)用程序時(shí)運(yùn)行在谷歌應(yīng)用引擎上的,內(nèi)置的服務(wù)賬號(hào)要關(guān)聯(lián)到應(yīng)用程序。

  4. 如果你的應(yīng)用程序時(shí)運(yùn)行在谷歌計(jì)算引擎上的,內(nèi)建的服務(wù)賬號(hào)必須關(guān)聯(lián)到虛擬機(jī)。

  5. 如果不遵循上述約束,就會(huì)發(fā)生錯(cuò)誤。

在應(yīng)用程序代碼中調(diào)用應(yīng)用程序的默認(rèn)憑證

默認(rèn)憑證被集成在谷歌應(yīng)用接口客戶端庫(kù)中。支持的環(huán)境有安裝在 Linux,Windows 和 Mac OS 上的應(yīng)用,以及 GCE(Google Compute Engine )虛擬機(jī)。

Java

版本為 1.19 的 谷歌應(yīng)用接口客戶端庫(kù) Java 版 中集成了默認(rèn)憑證。

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;

...

GoogleCredential credential = GoogleCredential.getApplicationDefault();

如下,它可以用來(lái)訪問(wèn)一個(gè)應(yīng)用接口服務(wù):

Compute compute = new Compute.Builder
    (transport, jsonFactory, credential).build();

一些憑證類(lèi)型向你請(qǐng)求某些 scopes,但是服務(wù)實(shí)體入口點(diǎn)并不受理。如果你偶爾遭遇了這個(gè)情節(jié),就像下面所做的那樣,你需要注入 scopes:

Collection COMPUTE_SCOPES =
    Collections.singletonList(ComputeScopes.COMPUTE);
if (credential.createScopedRequired()) {
    credential = credential.createScoped(COMPUTE_SCOPES);
}

參考:谷歌應(yīng)用接口客戶端庫(kù) Java 版文檔.

Python

版本為 1.3 的 谷歌應(yīng)用接口客戶端庫(kù) Python 版 中集成了默認(rèn)憑證。

from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()

可以這樣使用服務(wù):

from googleapiclient.discovery import build

...

service = build('compute', 'v1', credentials=credentials)

build() 方法在給定的服務(wù)內(nèi)留意了注入的適當(dāng)范圍,雖然 create_scoped 方法可以顯式地做到這一點(diǎn)。

參考:谷歌應(yīng)用接口客戶端庫(kù) Python 版文檔.

工具支持

谷歌云 SDK

自谷歌云 SDK 0.9.51 以來(lái),當(dāng)在本地測(cè)試應(yīng)用程序代碼時(shí),使用命令 gcloud auth login ,可以讓你的身份憑證用來(lái)當(dāng)做應(yīng)用程序默認(rèn)憑證的代理。

這是最快速便捷地在本地校驗(yàn)代碼的方法。有一點(diǎn)需要注意,你的個(gè)人身份憑證通常有很多的權(quán)限,所以你該找一個(gè)場(chǎng)景,這個(gè)場(chǎng)景是一個(gè)應(yīng)用接口在本地被調(diào)用而不是在發(fā)布之后被調(diào)用。它只能在谷歌云應(yīng)用接口許可范圍內(nèi)工作。如果這個(gè)方法引發(fā)了問(wèn)題,考慮下載服務(wù)賬號(hào)密鑰來(lái)設(shè)置環(huán)境變量 environment variable

谷歌應(yīng)用引擎 SDK

自谷歌應(yīng)用引擎SDK 1.9.18 以來(lái),當(dāng)在本地運(yùn)行開(kāi)發(fā)用應(yīng)用程序服務(wù),可以使用應(yīng)用程序的默認(rèn)憑證。注意,這個(gè)僅僅支持通過(guò)使用命令 gcloud preview app run 來(lái)完成上訴效果,不支持在老舊的特定語(yǔ)言的開(kāi)發(fā)服務(wù)器。

發(fā)現(xiàn)并修理故障

在運(yùn)行環(huán)境的上下文中,應(yīng)用程序的默認(rèn)憑證允許你使用不同的身份憑證。這有時(shí)意味著需要調(diào)整來(lái)確保所有正在使用的身份擁有權(quán)限。

權(quán)限

使用應(yīng)用程序的默認(rèn)憑證的代碼,可以像用戶或者服務(wù)賬號(hào)那樣的身份憑證運(yùn)行,包括內(nèi)置的服務(wù)賬號(hào)的身份憑證。如果使用了一個(gè)以上的身份憑證,他們必須都有權(quán)限調(diào)用。配置權(quán)限,請(qǐng)打開(kāi)谷歌開(kāi)發(fā)者面板Permissions 選項(xiàng)。

域 (Scopes)

他們采取 URI 的形式,名字一組給定的 API 的功能,OAuth2 的權(quán)限 scope 的定義是在一個(gè)給定的上下文中,可被調(diào)用的應(yīng)用接口。他們采取 URI 的形式,為給定的應(yīng)用接口命名,例如," scope。

下載的服務(wù)賬號(hào)的密鑰和谷歌應(yīng)用引擎內(nèi)建的服務(wù)賬號(hào),其 scope 必須在代碼中指定。應(yīng)用接口的封裝或許該這么做,但是在使用這個(gè)證書(shū)時(shí),會(huì)出錯(cuò)。獲取更多信息如何在你的代碼中注入 scope,請(qǐng)查看 Calling the Application Default Credentials in application code。

谷歌計(jì)算引擎虛擬機(jī)的服務(wù)賬號(hào),其支持的范圍必須在虛擬機(jī)創(chuàng)建時(shí)指定。如果使用谷歌云 SDK ,就要使用命令 gcloud compute instances create 以及指定 --scopes 參數(shù)來(lái)完成。

如果使用谷歌云 SDK 的命令 gcloud auth login ,在本地提供自己的身份憑證,scope 就會(huì)被固定,即使 scope 包含了所有的谷歌云應(yīng)用接口的范圍。如果你需要不在這里談及的 scope,建議你下載服務(wù)中的密鑰。