訪問控製
目錄
用戶簽名驗證(Authentication)
NOS 通過使用訪問憑證 ID( AccessKey )/訪問憑證密鑰( SecretKey )非對稱加密的方法來驗證某 個請求的發送者身份。AccessKey 用於標識用戶,SecretKey 是用戶用於加密簽名字符串和 NOS 用來驗證簽名字符串的密鑰,其中 SecretKey 必須保密,隻有用戶和 NOS 知道。每個訪問憑證 對都有 active/inactive 兩種狀態
- active 表明用戶可以用此 ID 對簽名驗證請求
- inactive 表明用戶暫停此 ID 對簽名驗證的功能
一個用戶可以同時擁有多個 active 或者 inactive 的 ID 對。用戶可以登錄 API KEY 管理頁麵查看 管理訪問憑證。當用戶想以個人身份向 NOS 發送請求時,需要首先將發送的請求按照 NOS 指定 的格式生成簽名字符串;然後使用 SecretKey 對簽名字符串進行加密產生驗證碼。NOS 收到請 求以後,會通過 AccessKey 找到對應的 SecretKey,以同樣的方法提取簽名字符串和驗證碼, 如果計算出來的驗證碼和提供的一樣即認為該請求是有效的;否則,NOS 將拒絕處理這次請求 ,並返回相關的錯誤碼。例如若 AccessKey 格式有誤,返回錯誤碼: InvalidAccessKeyId 。
在 Head 中包含簽名
用戶可以在 HTTP 請求頭中增加 Authorization(授權)來包含簽名信息,表明這個請求已被授 權。如果用戶的請求中沒有 Authentication 字段,則認為是匿名訪問。
驗證碼計算
"Authorization: NOS " + AccessKey + ":" + Base64(HMAC-SHA256(HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + CanonicalizedResource))
- HTTP-Verb 表示 HTTP 請求類型,如:PUT,GET,DELETE等
- Content-MD5 表示內容數據的 MD5 值,某些 API 該字段非必須
- Content-Type 表示內容的類型,某些 API 該字段非必須
- Date 表示此次操作的時間,格式必須符合 RFC1123 的日期格式,示例:Wed, 01 Mar 2009 12:00:00 GMT
- CanonicalizedHeaders 表示請求中其他重要的 HTTP 頭。
- CanonicalizedResource 表示用戶想要訪問的 NOS 資源。
其中,Date 和 CanonicalizedResource 不能為空,其餘字段如為空,用空字符串" "代 替;如果請求中的 Date 時間和 NOS 服務器的時間差正負15分鍾以上,NOS 服務器將拒絕該服務 ,並返回錯誤碼:AccessDenied。
構建 CanonicalizedHeaders 的方法
所有以 ”x-nos-“ 為前綴的 HTTP Header 被稱為 CanonicalizedHeaders 。它的構建方法如下:
1. 將所有以 "x-nos-" 為前綴的 HTTP 請求頭的 key 轉換成小寫字母。如 "x-nos-meta-Name: Easyread" 轉換成 "x-nos-meta-name: Easyread"。
2. 如果有相同名字的請求頭,則根據標準 RFC 2616, 4.2 章進行合並(兩個值之間隻用逗號分隔)。如有兩個名為 "x-nos-meta-name" 的請求頭,對應的值分別為 "photo" 和 "Easyread",則合並後為:"x-nos-meta-name:photo,Easyread" 。注意:合並之後的順序和請求頭中出現的順序一致
3. 將上一步得到的所有 HTTP 請求頭按照字典序進行升序排列。
4. 刪除請求頭和內容之間分隔符兩端出現的任何空格。如 "x-nos-meta-name : photo,Easyread" 轉換成:"x-nos-meta-name:photo,Easyread"。
5. 將所有的頭和內容用 \n 分隔符分隔拚成最後的 CanonicalizedHeader。
構建 CanonicalizedResource 的方法
用戶發送請求中想訪問的 NOS 目標資源被稱為 CanonicalizedResource 。它的構建方法如下:
- 將 CanonicalizedResource 置成空字符串"";
- 放入要訪問的 NOS 資源:對於 ListBucket 操作,資源為/;對於桶操作,資源為 /BucketName/;對於對象操作,資源為 /BucketName/ObjectName;
- 如果請求包含子資源( sub-resource ),那麼將所有子資源的 Key 按照字典序排列,並以”&”為分隔符生成子資源字符串。在 CanonicalizedResource 字符串尾添加”?”和子資源字符串。示例:/BucketName/ObjectName?partNumber=PartNumber&uploadId=UploadId
sub-resource,指的是 NOS 裏麵某些特殊的請求參數。NOS 當前支持的子資源包括:”acl”, “location”, “uploadId”, “uploads”, “partNumber”, “delete”等
在計算簽名頭的時候請遵循如下規則
1. 用來簽名的字符串為 UTF-8 格式,URL 中的 resource 和 queryString 應該經過 URL encode 。
2. 簽名的方法用 RFC 2104 中定義的 HMAC-SHA1 方法,其中 Key 為 Secretkey 。
3. Content-Type 和 Content-MD5 在請求中不是必須的,但是如果請求需要簽名驗證,空值的話以回車符代替。
4. 在所有非 HTTP 標準定義的 header 中,以 ”x-nos-“ 開頭的 header ,都需要加入簽名字符串。
5. 以 ”x-nos-“ 開頭的 header 在簽名驗證前需要符合以下規範:
- header 的名字需要變成小寫。
- header 按字典序自小到大排序。
- 分割 header name 和 value 的冒號前後不能有空格。
- 每個 Header 之後都有一個回車,如果沒有 Header,CanonicalizedHeaders 就設置為空。
注意事項
1. 如果傳入的 AccessKey 不存在或 inactive,返回 403 Forbidden。錯誤碼:InvalidAccessKeyId。
2. 若用戶請求頭中 Authorization 值的格式不對,返回 403 Forbidden。錯誤碼:InvalidAccessKeyId。
3. 如果簽名驗證的時候,請求頭中沒有傳入Date或者格式不正確,返回 403 Forbidden 錯誤。錯誤碼: AccessDenied 。
4. 傳入請求的時間必須在 NOS 服務器當前時間之後的15分鍾以內,否則返回 403 Forbidden。錯誤碼:RequestTimeTooSkewed 。
5. 如果 AccessKey 是 active 的,但 NOS 判斷用戶的請求發生簽名錯誤,則返回 403 Forbidden,錯誤碼 AccessDenied。
6. 計算簽名的邏輯,可參看各類 SDK 源碼 。
Bucket權限控製
NOS 提供 Bucket 級別的權限訪問控製,Bucket 目前有兩種訪問權限:Public-read 和 Private,它們的含義如下:
- Public-read:隻有該 Bucket 的創建者可以對該 Bucket 內的 Object 進行寫操作(包括 Put 和 Delete Object);任何人(包括匿名訪問)可以對該 Bucket 中的 Object 進行讀操作(Get Object)。
- Private:隻有該 Bucket 的創建者可以對該 Bucket 內的 Object 進行讀寫操作(包括 Put 、 Delete 和 Get Object);其他人無法訪問該 Bucket 內的 Object 。
用戶新創建一個 Bucket 時,如果不指定 Bucket 權限,NOS 會自動為該 Bucket 設置 Private 權限。對於一個已經存在的 Bucket,隻有它的創建者可以修改該 Bucket 的權限。
Object外鏈地址的構成規則
如果一個 Bucket 設置成 Public-read 權限,意味著你允許其他用戶來訪問屬於你的 Object。你的 Object 的外鏈地址構成規則如下:
https://<你的Bucket名字>.endpoint/<你的Object名字>
例如,在一個杭州分區 Bucket(名字為photo)中,放了名為一個 ”image/test.jpg” 的 Object,那麼這個 Object 的 URL 為:
https://photo.nos-eastchina1-i.netease.com/image/test.jpg
photo 是 Bucket
nos-eastchina1-i.netease.com 為杭州分區的訪問域名
image/test.jpg 是 Object
用戶可以將該 URL 鏈接放入 HTML 中:
<img src=”https://photo.nos-eastchina1-i.netease.com/image/test.jpg” />
最後更新:2017-01-03 10:48:54