閱讀317 返回首頁    go 網易 go 網易蜂巢


訪問控製

目錄

用戶簽名驗證(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

  上一篇:go 貴州地區管局規則
  下一篇:go PHP快速入門(鏡像)