全部产品

签名认证

更新时间:2017-06-07 13:26:11   分享:   

对于每一个请求,函数计算服务会根据请求头部的Authorization字段来校验是否合法。客户端须使用与函数计算服务端一致的签名算法才能通过验证,对于未包含签名字段或者签名错误的请求,函数计算服务将会返回HTTP 403错误。

签名算法

  1. signature = base64(hmac-sha256(HTTP_METHOD + "\n"
  2. + CONTENT-MD5 + "\n"
  3. + CONTENT-TYPE + "\n"
  4. + DATE + "\n"
  5. + CanonicalizedFCHeaders
  6. + CanonicalizedResource))
  7. Authorization = "FC " + accessKeyID + ":" + signature
  • HTTP_METHOD 表示大写的HTTP Method(如:PUT, GET, POST, DELETE)
  • CONTENT-MD5 表示请求内容数据的MD5值。如果请求的Header中没有传Content-MD5,则此处填入空串
  • CONTENT-TYPE 表示请求内容的类型
  • DATE 表示此次操作的时间,不能为空,目前只支持GMT格式
    • 注意:客户端需要保证生成的时间与函数计算服务端的时间相差不超过15分钟,否则函数服务将拒绝此请求
  • CanonicalizedFCHeaders 表示所有以x-fc-为前缀的HTTP头组成的字符串,生成方式见下文
  • CanonicalizedResource 表示请求的URL的Path,例如/2016-08-15/services/my-service/functions?limit=100
  • hmac-sha256需要以用户的AccessKeySecret为Key

CanonicalizedFCHeaders

生成步骤如下:

  1. 找出请求头中所有以x-fc-开头的字段(不区分大小写)
    • 对于符合前缀的字段,先将字段名转换成小写,然后将这些字段按字段名从小到大排序
  2. 对于每一个字段,生成一个子串${key}:${value}\n
    • ${key}是HTTP头的名称(转换成小写)
    • ${value}是HTTP头的值
    • 例如:X-Fc-Invocation-Type: Sync变成x-fc-invocation-type:Sync\n
  3. 将上述生成的子串连接成一个整串

伪代码如下:

  1. // javascript
  2. // prefix = 'x-fc-'
  3. function buildCanonicalHeaders(headers, prefix) {
  4. var list = [];
  5. var keys = Object.keys(headers);
  6. for (let i = 0; i < keys.length; i++) {
  7. var key = keys[i];
  8. if (key.startsWith(prefix)) {
  9. list.push(key);
  10. }
  11. }
  12. list.sort();
  13. var canonical = '';
  14. for (let i = 0; i < list.length; i++) {
  15. const key = list[i];
  16. canonical += `${key}:${headers[key]}\n`;
  17. }
  18. return canonical;
  19. }

请求示例

请求:

  1. GET /2016-08-15/services?limit=100&nextToken=&prefix=&startKey= HTTP/1.1
  2. Host: 1237050315505682.fc.cn-shanghai.aliyuncs.com
  3. User-Agent: go-sdk-0.1
  4. Accept: application/json
  5. Authorization: FC LTAIUyt0Yeq1rgqo:GBmoz6OwC7bobTlD1jboBZ9PkaZ1e4cKsQ+5/dlLTns=
  6. Date: Mon, 08 May 2017 03:08:31 GMT
  7. X-User-Agent: go-resty v0.11 - https://github.com/go-resty/resty
  8. Accept-Encoding: gzip

响应:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json; charset=utf-8
  3. X-Fc-Request-Id: ab7c7602-0922-f04f-b4ee-923cd7df7fb0
  4. Date: Mon, 08 May 2017 03:08:31 GMT
  5. Transfer-Encoding: chunked

代码示例

可以参考我们已经发布的SDK中签名部分的代码:

本文导读目录
本文导读目录
以上内容是否对您有帮助?