[英]GCP - Impersonate service account as a user
我希望允許用戶模擬服務帳戶對長時間運行的進程進行操作。 但是,所有代碼示例都說明了模擬另一個服務帳戶的服務帳戶。
用戶可以直接模擬服務帳號嗎? 如果是這樣,如何?
我正在關注此示例代碼。
初始化無權訪問列表存儲桶的源憑據:
from google.oauth2 import service_acccount
target_scopes = [
'https://www.googleapis.com/auth/devstorage.read_only']
source_credentials = (
service_account.Credentials.from_service_account_file(
'/path/to/svc_account.json',
scopes=target_scopes))
現在使用源憑據獲取憑據以模擬另一個服務帳戶:
from google.auth import impersonated_credentials
target_credentials = impersonated_credentials.Credentials(
source_credentials=source_credentials,
target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
target_scopes = target_scopes,
lifetime=500)
不要嘗試從用戶帳戶模擬服務帳戶,而是授予用戶創建服務帳戶 OAuth 訪問令牌的權限。
授予用戶在服務帳戶上的角色roles/iam.serviceAccountTokenCreator
。
調用 API generateAccessToken
從服務帳戶創建訪問令牌。
項目.serviceAccounts.generateAccessToken
一個簡單的 HTTP POST 請求將返回一個訪問令牌。 使用服務帳戶電子郵件地址修改以下請求。
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE-ACCOUNT-NAME@PROJECTID.iam.gserviceaccount.com:generateAccessToken
請求正文:
{
"delegates": [],
"scope": [
"https://www.googleapis.com/auth/cloud-platform"
],
"lifetime": "3600s"
}
此 API 需要授權。 在 HTTP 授權標頭中包含用戶的 OAuth 訪問令牌。
Authorization: Bearer ACCESS_TOKEN
響應機構:
{
"accessToken": "eyJ0eXAifeA...NiK8i",
"expireTime": "2020-03-05T15:01:00.12345678Z"
}
是的,您可以從用戶模擬到服務帳戶。 您只需要確保您的用戶具有目標服務帳戶的服務帳戶令牌創建者角色。 您需要通過以下方式明確授予它:
即使你是項目負責人,它也不會削減它。
請注意,申請許可可能需要 1-2 分鍾,因此如果您的代碼出現以下錯誤:
Unable to acquire impersonated credentials...
確保您擁有上述權限,如果您最近剛剛添加了它,請休息一下,然后再試一次:)
代碼幾乎保持不變,這里是文檔中的一個改編示例:
import google.auth
import google.auth.impersonated_credentials
from google.cloud import storage
target_scopes = [
"https://www.googleapis.com/auth/devstorage.read_only"
]
creds, pid = google.auth.default()
print(f"Obtained default credentials for the project {pid}")
tcreds = google.auth.impersonated_credentials.Credentials(
source_credentials=creds,
target_principal="<target service account email>",
target_scopes=target_scopes,
)
client = storage.Client(credentials=tcreds)
buckets = client.list_buckets(project=pid)
for bucket in buckets:
print(bucket.name)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.