2024/10/23 14:21:22
实现 HTTP HMAC 认证
本文介绍如何实现 HTTP HMAC 认证。
前提条件
发送请求时,你需要通过 HMAC-SHA256 算法生成一个签名,并在请求头部的 Authorization
字段传入签名。在生成签名的过程中,你需要用到以下声网账号的信息:
- 声网项目的 App ID,详见获取 App ID。
- 声网控制台 RESTful API 中提供的客户 ID 及客户密钥,详见生成客户 ID 和密钥。
示例代码
下面的 Python 代码(Python 3.7+)以获取域名列表的 API 为例,演示如何生成 Authorization
字段。
Python
import hmac
import base64
import datetime
from hashlib import sha256
# 你的声网项目的 App ID
# 需要设置环境变量 AGORA_APP_ID
appid = os.environ.get("AGORA_APP_ID")
# 客户 ID
# 需要设置环境变量 AGORA_CUSTOMER_USER_NAME
customer_username = os.environ.get("AGORA_CUSTOMER_USER_NAME")
# 客户密钥
# 需要设置环境变量 AGORA_CUSTOMER_SECRET
customer_secret = os.environ.get("AGORA_CUSTOMER_SECRET")
# 请求包体
data = ""
# 请求域名
host = "api.sd-rtn.com"
# 请求方法和 endpoint
req_metd = 'GET'
path = f'/v1/projects/{appid}/fls/domains'
body_sha256 = sha256(data.encode('utf-8')).digest()
body_sha256_base64 = base64.b64encode(body_sha256)
date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
request_line = "{} {} {}".format(req_metd, path, "HTTP/1.1")
digest = "SHA-256={}".format(body_sha256_base64.decode("utf-8"))
signing_string = "host: {}\ndate: {}\n{}\ndigest: {}".format(host, date, request_line, digest)
signature = base64.b64encode(
hmac.new(customer_secret.encode("utf-8"), signing_string.encode("utf-8"), sha256).digest())
authorization = 'hmac username="{}", algorithm="hmac-sha256", headers="host date request-line digest", signature="{}"'.format(
customer_username, signature.decode("utf-8"))