3. 访问控制

3.1. 用户签名验证(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。

3.3. 在URL中包含签名

除了使用Authorization Header Http 头部之外,私有桶的访问外链用户还可以在URL中加入 签名信息,这样用户就可以把私有桶资源,以签名HTTP URL方式转给第三方实现授权访问。

3.3.1. URL中包含签名示例

http://nos.netease.com/myBucket/myObject?NOSAccessKeyId=b65d532bf4834789b5d38e394b47023d&Expires=1141889120&Signature=cjrwrMDR6xoP5jajz17ybSjvftQ%3D

在URL中实现签名,必须至少包含SignatureExpiresNOSAccessKeyId三个参数。Expires这个参数的值是一个UNIX时间(自UTC时间1970年1月1号开始的秒数), 用于标识该URL的超时时间。如果NOS接收到这个URL请求的时候晚于签名中包含的Expires参 数时,则返回请求超时的错误码。例如:当前时间是114189060,开发者希望创建一个60秒后 自动失效的URL,则可以设置Expires时间为1141889120。

所有NOS支持的请求和各种Header参数,在URL中进行签名的方法和上节介绍的签名算法基 本一样。主要区别如下:

  1. 通过URL包含签名时,之前的Date参数换成Expires参数。
  2. 对签名串做URL-Encode编码
  3. 对URL而言,Content-MD5、Content-Type等都是空串("")
Signature = URL-Encode (Base64(HMAC-SHA256(HTTP-Verb + "\n"
                  + Content-MD5 + "\n"
                  + Content-Type + "\n"
                  + Expires + "\n"
                  + CanonicalizedHeaders
                  + CanonicalizedResource))

其他注意事项:

  1. 不支持同时在URL和Head中包含签名。
  2. 如果传入的Signature,Expires,NOSAccessKeyId出现不止一次,以第一次为准。
  3. 请求先验证请求时间是否晚于Expires时间,然后再验证签名。

3.3.2. 注意事项

  1. 使用在URL中签名的方式,会将你授权的数据在过期时间以内曝露在互联网上,请预先评估使用风险。
  2. URL签名只支持GET请求下载Object。
  3. 在URL中添加签名时,Signature,Expires,NOSAccessKeyId顺序可以交换,但是如果Signature,Expires,NOSAccessKeyId缺少其中的一个或者多个,返回403 Forbidden。错误码:AccessDenied。
  4. 如果访问的当前时间晚于请求中设定的Expires时间,返回403 Forbidden。错误码:AccessDenied。
  5. 如果传入请求时间,必须在NOS服务器当前时间之后的15分钟以内。否则返回403 Forbidden。错误码:RequestTimeTooSkewed。
  6. 如果Expires时间格式错误,返回403 Forbidden。错误码:AccessDenied。
  7. 如果URL中包含参数Signature,Expires,NOSAccessKeyId中的一个或者多个,并且Head中也包含签名消息,返回消息400 Bad Request。错误码:InvalidArgument。
  8. 生成URL中的签名字符串时,除Date被替换成Expires参数外,仍然包含content-type、content-md5、CanonicalizedHeaders、CanonicalizedResource等上节中定义的Header。(请求中虽然仍然有Date这个请求头,但不需要将Date加入签名字符串中)

3.4. 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的权限。

3.5. Object外链地址的构成规则

如果一个Bucket设置成Public-read权限,意味着你允许其他用户来访问属于你的Object。你的Object的外链地址构成规则如下:

http://<你的Bucket名字>.endpoint/<你的Object名字>

例如,在一个杭州分区Bucket(名字为photo)中,放了名为一个”image/test.jpg”的Object,那么这个Object的URL为:

http://photo.nos-eastchina1-i.netease.com/image/test.jpg

photo是Bucket

nos-eastchina1-i.netease.com为杭州分区的访问域名

image/test.jpg是Object

用户可以将该URL链接放入HTML中:

<img src=”http://photo.nos-eastchina1-i.netease.com/image/test.jpg” />