访问控制
用户签名验证(Authentication)
NCDN通过使用访问凭证ID/访问凭证密钥(AccessID/SecretKey)对称加密的方法来验证某个请求的发送者身份。AccessID用于标识用户,SecretKey是用户用于加密签名字符串和NCDN用来验证签名字符串的密钥,其中SecretKey必须保密,只有用户和NCDN知道。每个访问凭证对都有active/inactive两种状态。
- active表明用户可以用此ID对签名验证请求
- inactive表明用户暂停此ID对签名验证的功能
一个用户可以同时拥有0至2个active或者inactive的ID对。用户可以登录网易云计算管理平台(http://cloud.netease.com)查看访问凭证。当用户想以个人身份向NCDN发送请求时,需要首先将发送的请求按照NCDN指定的格式生成签名字符串;然后使用SecretKey对签名字符串进行加密产生验证码。NCDN收到请求以后,会通过AccessID找到对应的SecretKey,以同样的方法提取签名字符串和验证码,如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,NCDN将拒绝处理这次请求,并返回相关的错误码。例如若AccessID格式有误,返回错误码:InvalidAccessKeyId。
在Head中包含签名
用户可以在HTTP请求头中增加Authorization(授权)来包含签名信息,表明这个消息已被授权。如果用户的请求中没有Authentication字段,则认为是匿名访问。
验证码计算
Authorization = "NCDN " + AccessKey + ":" + Signature
Signature = Base64(HMAC-SHA256(SecretKey,
HTTP-Verb + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedResource))
- HTTP-Verb表示HTTP请求类型,如:PUT,GET,DELETE等
- Content-MD5表示内容数据的MD5值,非必须
- Content-Type表示内容的类型,非必须
- Date表示此次操作的时间,格式必须符合RFC1123的日期格式,示例:Wed, 01 Mar 2009 12:00:00 GMT
- CanonicalizedResource 表示用户想要访问的NCDN资源
其中,Date和CanonicalizedResource不能为空,其余字段如为空,用空字符串""
代替;如果请求中的Date时间和NCDN服务器的时间差正负15分钟以上,NCDN服务器将拒绝该服务,并返回错误码:AccessDenied。
构建CanonicalizedResource的方法
用户发送请求中想访问的NCDN目标资源被称为CanonicalizedResource。它的构建方法如下:
- 将CanonicalizedResource置成空字符串
""
; - 放入要访问的NCDN资源:对于创建加速域名操作,资源为/domain;对于创建缓存刷新请求,资源为/domain/${domainName}/purge;对于预热请求,资源为/domain/${domainName}
- 如果请求包含子资源(sub-resource),那么将所有子资源的Key按照字典序排列,并以”&”为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加”?”和子资源字符串。示例:/domain/${domainName}/report/flow?dateFrom=${dateFrom}&dateTo=${dateTo}&type=&{type}
Attention
sub-resource,指的是NCDN里面某些特殊的请求参数。NCDN当前支持的子资源包括:”enable”, “disable”, “pageSize”, “pageNum”, “dateFrom”, “dateTo”, “type”, “orderType”, “sortField”, “serviceType”, “status”, “isEnabled”
在计算签名头的时候请遵循如下规则
- 用来签名的字符串为UTF-8格式,URL中的resource和queryString应该经过URL encode。
- 签名的方法用RFC 2104中定义的HMAC-SHA256方法,其中Key为Secretkey。
- Content-Type和Content-MD5在请求中不是必须的,但是如果请求需要签名验证,空值的话以回车符代替。
注意事项
- 如果传入的AccessID不存在或inactive,返回403 Forbidden。错误码:InvalidAccessKeyId。
- 若用户请求头中Authorization值的格式不对,返回403 Forbidden。错误码:InvalidAccessKeyId。
- 如果签名验证的时候,请求头中没有传入Date或者格式不正确,返回403 Forbidden错误。错误码:AccessDenied。
- 传入请求的时间必须在NCDN服务器当前时间之后的15分钟以内,否则返回403 Forbidden。错误码:RequestTimeTooSkewed。
- 如果AccessID是active的,但NCDN判断用户的请求发生签名错误,则返回403 Forbidden,错误码AccessDenied。