簡體   English   中英

如何使用 Python3.7 在 Google App Engine 標准環境中為 Google 雲存儲簽名 url?

[英]How to signed url for Google cloud storage on Google App Engine Standard environment with Python3.7?

我找不到使用 Python3.7 在 Google App Engine 標准環境中使用簽名網址的方法。

我在這里查看文檔: https : //cloud.google.com/storage/docs/access-control/signing-urls-manually

在 Google App Engine 應用程序中,您可以使用App Engine App Identity服務來簽署您的字符串。

但是 App Engine App Identity 依賴於google.appengine包,這在 python 3.7 env 上不可用,如解釋here

專有 App Engine API 在 Python 3 中不可用。本節列出了推薦的替代品。

總體目標是您的應用程序應該是完全可移植的,並且可以在任何標准 Python 環境中運行。 您編寫的是標准 Python 應用程序,而不是 App Engine Python 應用程序。 作為這一轉變的一部分,您不再需要為應用的核心功能使用專有的 App Engine API 和服務。 目前,App Engine API 在 Python 3.7 運行時中不可用。

sdk 上的所有 api 都依賴於google.appengine並在 python 3.7 env 上引發異常: EnvironmentError('The App Engine APIs are not available.') 在此處引發依賴專有 api 的異常:

try:
    from google.appengine.api import app_identity
except ImportError:
    app_identity = None

我知道我可以使用許多解決方案,例如ServiceAccountCredentials.from_json_keyfile_dict(service_account_dict)但我必須直接在應用引擎上上傳帶有憑據的文件,我不能這樣做,因為項目憑據將在 git 或 ci 上公開。

我真的很想依賴來自應用引擎的默認憑據,比如其他 Google Cloud api,比如storage.Client() ,例如開箱即用。

有什么建議嗎?

對於Python與Google Cloud的交互,請使用App Engine標准Python 3運行時支持的Python客戶端

要使用App Engine Standard中的google-cloud-storage訪問雲存儲:

  1. 添加依賴項到requirements.txt> google-cloud-storage == 1.14.0
  2. 使用Storage Client庫 ,僅使用storage.Client()身份驗證。

根據您需要實現的目標,我還建議您嘗試不同的方法:

  1. 允許匿名訪問存儲在存儲桶中的公共數據。
  2. 對於簽名的URL API調用,請使用方法:projects.serviceAccounts.signBlob 文檔包括示例:

也可以使用appengine apiblob進行簽名

google.appengine.api.app_identity.sign_blob()

這個問題可能很老,但它是第一個在 Google 搜索中顯示的問題,所以我認為它可能會幫助將來尋找的人也在這里發布這個問題。

此處發布的答案@guillaume-blaquiere確實有效,但它需要一個未提及的額外步驟,即將 IAM 中的Service Account Token Creator角色添加到您的默認服務帳戶,這將允許所述默認服務帳戶“模擬服務帳戶” (創建 OAuth2 訪問令牌、簽署 blob 或 JWT 等)。”

這允許默認服務帳戶根據signBlob 文檔對 blob 進行簽名。

我在 AppEngine 上嘗試過,一旦獲得許可,它就可以完美運行。

import datetime as dt

from google import auth
from google.cloud import storage

# SCOPES = [
#     "https://www.googleapis.com/auth/devstorage.read_only",
#     "https://www.googleapis.com/auth/iam"
# ]

credentials, project = auth.default(
#     scopes=SCOPES
)
credentials.refresh(auth.transport.requests.Request())

expiration_timedelta = dt.timedelta(days=1)

storage_client = storage.Client(credentials=credentials)
bucket = storage_client.get_bucket("bucket_name")
blob = bucket.get_blob("blob_name")

signed_url = blob.generate_signed_url(
    expiration=expiration_timedelta,
    service_account_email=credentials.service_account_email,
    access_token=credentials.token,
)

我下載了 AppEngine默認服務帳戶的密鑰以進行本地測試,為了使其在 AppEngine 環境之外正常工作,我必須根據設置SCOPES的注釋行向憑據添加適當的范圍。 如果僅在 AppEngine 本身中運行,您可以忽略它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM