You need to enable JavaScript to run this app.
导航

HTTP 请求鉴权

最近更新时间2024.03.29 18:39:57

首次发布时间2023.02.21 19:42:16

本文档介绍如何在调用 HTTP API 时,实现请求鉴权。
移动解析 HTTPDNS 的 HTTP API 通过查询参数中的 sign 参数进行请求鉴权。您需要自行计算 sign 参数的值。

计算 sign 参数所需的参数

您需要当前 API 的查询参数和 secret_key 来计算 sign 参数。

  • 查询参数:当前 API 的查询参数,不包含 sign 参数。
  • secret_key:移动解析 HTTPDNS 的 Secret Key。可以从控制台的 鉴权配置 页面获取。在您 开通 HTTPDNS 后,系统会自动生成一个 Secret Key。

对于不同的 API,您使用的查询参数也不同。本文档分别介绍了以下 API 的 sign 参数计算方法:

为解析一个或多个域名 API 计算 sign 参数

如果您调用 解析一个或多个域名 API 发送请求,您的请求中包含以下查询参数。同时,移动解析 HTTPDNS 的 Secret Key 是 secret_key

  • timestamp
  • account_id
  • domain
  • ip
  • type

您可以参见以下步骤计算 sign 参数。

  1. 将请求参数的值按照 ASCII 码从小到大排序。
  2. 用下划线将这些参数连接成一个字符串。
  3. 计算该字符串的 MD5 哈希值。该 MD5 哈希值即为当前请求的 sign 参数。

签名计算的伪代码如下:

sign = MD5(strings.join(sort(secret_key, timestamp, account_id, domain, ip, type), "_"))

sign 参数计算示例

假设您调用 解析一个或多个域名 API 发送请求,假设您的请求中包含以下参数:

  • secret_key: QlgAuFMwNUwN
  • timestamp: 1566808387000
  • account_id: 1023
  • domain: www.a.com,www.b.com
  • ip:请求中未包含
  • type:请求中未包含

sign 参数的计算方法为:
MD5(__1023_1566808387000_QlgAuFMwNUwN_www.a.com,www.b.com)
得到的 sign 参数为 4b00a808d49a334991b7e50d324a9287

说明

  • 如果 ip 参数和 type 参数没有在请求中包含,这两个参数也需要参与签名计算且参数的值为空字符串 ""
  • 无论 appid 参数是否在请求中包含,该参数都不参与签名计算。

sign 参数计算示例代码

下面的 Python 示例代码根据查询参数和 Secret Key 生成 sign 参数,并调用 解析一个或多个域名 API 向 HTTPDNS 服务端发送请求。
您需要自行把该示例代码保存为 resolve.py

# Python 3
import hashlib
import sys
import time
import requests
import pprint

if len(sys.argv) < 4:
    print("Usage:")
    print("  python3 ./resolve.py <accountId> <secretKey> <domains> [cip] [type]")
    sys.exit()

accountId=sys.argv[1]
secretKey=sys.argv[2]
domains=sys.argv[3]
cip=sys.argv[4] if len(sys.argv) >= 5 else ""
t=sys.argv[5] if len(sys.argv) == 6 else ""

timeStamp=str(int(1000*(time.time()+3600)))

# 生成签名参数
old=(secretKey, timeStamp, accountId, domains, cip, t)
new=sorted(old)
separator="_"
newStr=separator.join(new)
hl = hashlib.md5()
hl.update(newStr.encode(encoding='utf-8'))

qUrl="https://httpdns.volcengineapi.com/resolve?domain=" + domains + "&account_id=" + accountId + "&sign=" + hl.hexdigest() + "&timestamp=" + timeStamp
if len(cip) != 0:
    qUrl = qUrl + "&ip=" + cip
if len(t) != 0:
    qUrl = qUrl + "&type=" + t

print(qUrl)
r = requests.get(qUrl)
if r.status_code == 200:
    pprint.pprint(r.json())
else:
    print(r)

为获取最佳的 HTTPDNS 服务端 IP 地址 API 计算 sign 参数

如果您调用 获取最佳的 HTTPDNS 服务端 IP 地址 API 发送请求,您的请求中包含以下查询参数。同时,移动解析 HTTPDNS 的 Secret Key 是 secret_key

  • timestamp
  • account_id
  • svc_meta_ts

您可以参见以下步骤计算 sign 参数。

  1. 将请求参数的值按照 ASCII 码从小到大排序。
  2. 用下划线将这些参数连接成一个字符串。
  3. 计算该字符串的 MD5 哈希值。该 MD5 哈希值即为当前请求的 sign 参数。

签名计算的伪代码如下:

sign = MD5(strings.join(sort(secret_key, timestamp, account_id, svc_meta_ts), "_"))

sign 参数计算示例

假设您调用 获取最佳的 HTTPDNS 服务端 IP 地址 API 发送请求,假设您的请求中包含以下参数:

  • secret_key: QlgAuFMwNUwN
  • timestamp: 1566808387000
  • account_id: 1023
  • svc_meta_ts: 0

sign 参数的计算方法为:
MD5(0_1023_1566808387000_QlgAuFMwNUwN)
得到的 sign 参数为 0b93c934ff0283427b9fd7bfd40660e5

sign 参数计算示例代码

下面的 Python 示例代码根据查询参数和 Secret Key 生成 sign 参数,并调用 获取最佳的 HTTPDNS 服务端 IP 地址 API 向 HTTPDNS 服务端发送请求。
您需要自行把该示例代码保存为 svc_meta.py

# Python 3
import hashlib
import sys
import time
import requests
import pprint
if len(sys.argv) < 2:
    print("Usage:")
    print("  python3 ./svc_meta.py <accountId> <secretKey>")
    sys.exit()
accountId=sys.argv[1]
secretKey=sys.argv[2]
svc_meta_ts = "0"
timeStamp=str(int(1000*(time.time()+36000)))

# 生成签名参数
old=(secretKey, timeStamp, accountId, svc_meta_ts)
new=sorted(old)
separator="_"
newStr=separator.join(new)
hl = hashlib.md5()
hl.update(newStr.encode(encoding='utf-8'))
qUrl="https://httpdns.volcengineapi.com/svc_meta?" +  "svc_meta_ts=" + svc_meta_ts + "&account_id=" + accountId  + "&sign=" + hl.hexdigest()   + "&timestamp=" + timeStamp
print(qUrl)
r = requests.get(qUrl)
if r.status_code == 200:
    pprint.pprint(r.json())
else:
    print(r.json())