今天 Google 公佈了 Application Default Credentials (ADC),一個可以讓使用者更方便在 GCP 上去界接其他的需要使用 OAuth 存取的服務如 Google Cloud StorageGoogle BigQuery。這對常常寫 GAE 的我來說又更方便了。

在 GCP 專案建立之後,預設會自動產生 Service Accounts
這些內建的 Service Accounts 在進行 Server to Server 的存取時只需要應用程式本身的認証,直接使用 AppAssertionCredentials 可以不需透過 Flow 來建立 Credentials物件

1
2
3
4
5
6
7
8
import httplib2
from google.appengine.api import memcache
from apiclient.discovery import build
from oauth2client.appengine import AppAssertionCredentials
credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/devstorage.full_control')
http = credentials.authorize(httplib2.Http(memcache))
gcs_service = build('storage', 'v1', http=http, developerKey=DEVELOPER_KEY)

我們可以直接使用 AppAssertionCredentials 產生的 credentials 來建立 gcs_service 連線,這段程式在上傳到 GAE 上可以跑的很好,
不過如果你想要在本地測試的時候就需要特別指定 Server Accounts 的 credentials

Service Accounts

Create Service Account

  1. Click APIs & Auth > credential.
  2. Click Click new Client ID.
  3. Choose Service Account.
  4. Key type : P12 Key
  5. Click Create Client ID
  6. P12.Key file will be downloaded. You have to convert p12 to pem cause PKCS12 format is not supported by the PyCrypto library.

    1
    (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem)

在本地測試程式時還需將 --appidentity_email_address--appidentity_private_key_path 帶到 dev_appserver.py 參數中。
如果沒有帶入這二個參數本地測試會得到 401 Unauthorized 的錯誤訊息,不過上傳到 GAE 因為會透過應用程式本身的認証所以不會出錯。

1
2
# gae run locally.
dev_appserver.py yaml_or_war_path --appidentity_email_address=<service-account-email> --appidentity_private_key_path=<privatekey.pem-path>

Application Default Credentials (ADC)

Application Default Credentials 則提供了更簡便的作法

1
2
3
4
5
from oauth2client.client import GoogleCredentials
from apiclient.discovery import build
credentials = GoogleCredentials.get_application_default()
gcs_service = build('storage', 'v1', credentials=credentials)

Application Default Credentials (ADC) 的方式在本地測試時因為直接使用了 gcloud auth logincredentials,所以在開發上更方便更直覺。

注意事項:

  1. Google APIs Client Library for Python1.3 以上才支援 default credentials
  2. $ gcloud -v 確認 Google Cloud SDK 版本在 0.9.51 以上,Google App Engine SDK 版本在 1.9.18 以上

參考資料