簡體   English   中英

嘗試使用 REST API 公開對象時出現“訪問被拒絕。提供的范圍未被授權”錯誤

[英]"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.

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