阅读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快速入门(镜像)