為調(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í)。
出現(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)用程序外可以定義憑證。
通過(guò)調(diào)用客戶端代碼庫(kù),你可以獲取到應(yīng)用程序的默認(rèn)憑證。返回的憑證是由環(huán)境中運(yùn)行的代碼決定的。按照以下順序進(jìn)行檢查:
檢測(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)境變量。
如果你在你的設(shè)備上安裝了谷歌云 SDK,需要運(yùn)行命令 gcloud auth login
,你的身份可以用作代理,從那臺(tái)機(jī)器測(cè)試代碼調(diào)用應(yīng)用接口。
如果你的應(yīng)用程序時(shí)運(yùn)行在谷歌應(yīng)用引擎上的,內(nèi)置的服務(wù)賬號(hào)要關(guān)聯(lián)到應(yīng)用程序。
如果你的應(yīng)用程序時(shí)運(yùn)行在谷歌計(jì)算引擎上的,內(nèi)建的服務(wù)賬號(hào)必須關(guān)聯(lián)到虛擬機(jī)。
默認(rèn)憑證被集成在谷歌應(yīng)用接口客戶端庫(kù)中。支持的環(huán)境有安裝在 Linux,Windows 和 Mac OS 上的應(yīng)用,以及 GCE(Google Compute Engine )虛擬機(jī)。
版本為 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 版文檔.
版本為 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 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 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ù)器。
在運(yùn)行環(huán)境的上下文中,應(yīng)用程序的默認(rèn)憑證允許你使用不同的身份憑證。這有時(shí)意味著需要調(diào)整來(lái)確保所有正在使用的身份擁有權(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)。
他們采取 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ù)中的密鑰。