[英]"Access Denied. Provided scope(s) are not authorized" error when trying to make objects public using the REST API
我正在嘗試按照 Google 文檔中指示的步驟對 Google Cloud Storage 存儲桶中的單個對象設置權限以使其公開可見。 當我嘗試使用我們的應用程序服務帳戶發出這些請求時,它失敗並顯示 HTTP 狀態403
和以下消息:
拒絕訪問。 提供的范圍未經授權。
其他請求工作正常。 當我嘗試做同樣的事情但通過為我的個人帳戶提供令牌時,對對象的 ACL 的PUT
請求工作......大約 50% 的時間(rest 的時間是503
錯誤,這可能或可能沒有關系)。
更改服務帳戶的 IAM 策略以匹配我的 - 它通常具有 Storage Admin 和一些其他附帶角色 - 沒有幫助,即使我賦予它整體所有者 IAM 角色,這就是我所擁有的。
使用XML
API 和JSON
版本都沒有區別。 該請求有時會與我的個人憑據一起使用,這向我表明該請求的格式沒有錯誤,但必須有其他我迄今為止忽略的東西。 有任何想法嗎?
如果您使用的是默認計算引擎服務帳戶,請檢查服務帳戶的范圍。 默認情況下,范圍是受限的,對於 GCS,它是只讀的。 在清除緩存的情況下使用 rm -r ~/.gsutil 清除緩存
遵循您提供的文檔,並考慮以下幾點:
桶的訪問控制系統必須是細粒度的(不統一)。
為了使對象公開可用,請確保存儲桶未啟用公共訪問保護。 檢查此 鏈接以獲取更多信息。
在存儲桶中授予服務帳戶適當的權限。 作為指定的保存遺產對象所有者的角色(角色/ storage.legacyObjectOwner)是需要編輯對象的ACL 這里。 可以為單個存儲桶而不是項目授予此角色。
按照文檔中的說明創建json
文件。
使用gcloud auth application-default print-access-token
獲取授權訪問令牌並在 API 調用中使用它。 API 調用應如下所示:
curl -X POST --data-binary @JSON_FILE_NAME.json \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
"https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME/acl"
創建實例時需要添加 OAuth scope: cloud-platform。 看: https : //cloud.google.com/sdk/gcloud/reference/compute/instances/create#--scopes
選擇“允許完全訪問所有雲 API ”或選擇細粒度的方法
當嘗試從 GCE 實例訪問 GCS 並收到此錯誤消息時...
默認范圍是devstorage.read_only
,它阻止所有寫操作。
不確定是否需要范圍https://www.googleapis.com/auth/cloud-platform
,當范圍https://www.googleapis.com/auth/devstorage.read_only
默認給出時(例如,讀取啟動腳本)。 范圍應該是: https://www.googleapis.com/auth/devstorage.read_write
。
並且可以使用gcloud beta compute instances set-scopes
來編輯實例的范圍:
gcloud beta compute instances set-scopes $INSTANCE_NAME \
--project=$PROJECT_ID \
--zone=$COMPUTE_ZONE \
--scopes=https://www.googleapis.com/auth/devstorage.read_write \
--service-account=$SERVICE_ACCOUNT
還可以傳遞范圍的所有已知別名,例如: --scopes=cloud-platform
。 由於權限原因,該命令必須在實例之外運行 - 並且實例必須關閉,以便更改服務帳戶。
所以,多年后,事實證明問題是谷歌雲 API 使用“范圍”來指代兩個微妙不同的事物。 一個是服務帳戶可用的可用權限范圍,這是我(以及大多數其他回答該問題的人)一直關注的問題,但問題出在其他方面。 Python class google.auth.credentials.Credentials
,被各種谷歌雲客戶端類用來進行身份驗證,也有用於 OAuth 的權限范圍。你看這是怎么回事 - 我使用的客戶端是用默認的 OAuth scope 創建的'https://www.googleapis.com/auth/devstorage.read_write'
,但要公開某些內容需要 scope 'https://www.googleapis.com/auth/devstorage.full_control'
。 將此 scope 添加到 OAuth 憑據請求意味着設置對象的公共權限有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.