本章节主要介绍在基石智算平台的 API 请求中,签名(signature)的生成方法。可以根据实际情况使用API密钥来完成签名。

前提条件

在调用 API 之前,用户需要先在基石智算控制台平台上申请 API 密钥

  • API 示例:

    access_key_id = 'QYACCESSKEYIDEXAMPLE'
    secret_access_key = 'SECRETACCESSKEY'
  • 请求参数示例

    {
      'reverse': False,
      'namespace': 'ALL',
      'zone': 'hd1',
      'access_key_id': 'QYACCESSKEYIDEXAMPLE',
      'image_name': '',
      'limit': 3,
      'name': '',
      'offset': 0
    }

签名步骤

  1. 按照参数名进行升序排列,排序后的参数为:

    {
      'access_key_id': 'QYACCESSKEYIDEXAMPLE',
      'image_name': '',
      'limit': 3,
      'name': '',
      'namespace': 'ALL',
      'offset': 0,
      'reverse': False,
      'zone': 'hd1'
    }
  2. 构造 URL 请求,参数名和参数值之间用 = 号连接,参数和参数之间用 号连接,构造后的 URL 请求为:

    'access_key_id=QYACCESSKEYIDEXAMPLE&image_name=&limit=3&name=&namespace=ALL&offset=0&reverse=False&zone=hd1'
  3. 构造被签名串,被签名串的构造规则为: 被签名串 = HTTP请求方式 + "\n" + uri + "\n" + url 请求串

    根据上述的参数,假设请求路径为 /aicp/trains/namespaces/ALL/trains/,签名串为:

    'GET\n/aicp/trains/namespaces/ALL/trains/\naccess_key_id=QYACCESSKEYIDEXAMPLE&image_name=&limit=3&name=&namespace=ALL&offset=0&reverse=False&zone=hd1'
  4. 计算签名

    • 将API密钥的私钥 ( secret_access_key ) 作为key,生成被签名串的 HMAC-SHA256 或者 HMAC-SHA1 签名,更多信息可参见 RFC2104

    • 将签名进行 Base64 编码。

    • 将 Base64 编码后的结果进行 URL 编码。

    以 python3.10 为例,给出签名代码:

    import hashlib
    import base64
    import hmac
    from urllib import parse
    
    
    secret_access_key = "SECRETACCESSKEY"
    string_to_sign = 'GET\n/aicp/trains/namespaces/ALL/trains/\naccess_key_id=QYACCESSKEYIDEXAMPLE&image_name=&limit=3&name=&namespace=ALL&offset=0&reverse=False&zone=hd1'
    h = hmac.new(secret_access_key.encode(encoding="utf-8"), digestmod=sha256)
    h.update(string_to_sign.encode(encoding="utf-8"))
    sign = base64.b64encode(h.digest()).strip()
    signature = parse.quote_plus(sign)
  5. 追加到第二步参数的后面。

    • 请求参数

      'access_key_id=QYACCESSKEYIDEXAMPLE&image_name=&limit=3&name=&namespace=ALL&offset=0&reverse=False&zone=hd1&signature=uNDWS%2BeFb3gr6sfklJVbk%2F335Oa26ljMifKhVNI6koSMI%3D'
    • 实际 url

      'https://ai.coreshub.cn:443/aicp/trains/namespaces/ALL/trains?access_key_id=QYACCESSKEYIDEXAMPLE&image_name=&limit=3&name=&namespace=ALL&offset=0&reverse=False&zone=hd1&signature=uNDWS%2BeFb3gr6sfklJVbk%2F335Oa26ljMifKhVNI6koSMI%3D'