实现 HTTP 安全认证

更新时间不可用

了解如何在云端转码中 HTTP 鉴权,包括适用场景、配置步骤、实现要点和注意事项。

本文介绍如何进行以下 HTTP 鉴权:

  • HTTP 基本认证:易用,但安全性较弱。云端转码和观众端多码率都支持这种认证方式。
  • HTTP HMAC(Hash-based Message Authentication Code)鉴权:安全性较高。仅观众端多码率支持这种认证方式。

实现 HTTP 基本认证

云端转码和观众端多码率使用 HTTP 基本认证。本节介绍如何进行 HTTP 基本认证。

前提条件

已经从声网控制台获取客户 ID 和客户密钥,详见开通转码服务。

实现方法

参考 HTTP 基本认证实现。

实现 HTTP HMAC 鉴权

观众端多码率支持以下鉴权方式:

  • HTTP 基本认证。易用,但安全性较弱。
  • HTTP HMAC(Hash-based Message Authentication Code)鉴权。安全性较高,推荐使用。

本节介绍如何实现 HTTP HMAC 鉴权。

发送请求时,你需要通过 HMAC-SHA256 算法生成签名,并在请求 Header 的 Authorization 字段中传入该签名。在生成签名的过程中,你需要用到以下声网账号的信息:

示例代码

本节展示生成 Authorization 字段的示例代码。

Python
# -*- coding: utf-8 -*-
import os
import hmac
import base64
import datetime
from hashlib import sha256
import httplib

def execute_request_with_hmac():
    # 你的声网项目的 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")

    if not appid or not customer_username or not customer_secret:
        print("Please check environments: AGORA_APP_ID, AGORA_CUSTOMER_USER_NAME, AGORA_CUSTOMER_SECRET")
        return

    # 请求包体
    data = ""

    # 请求域名
    host = "api.sd-rtn.com"

    # 请求方法,如下仅为示例,你可按需修改
    req_metd = 'GET'
    # 请求 endpoint,如下仅为示例,你可按需修改
    path = "/v1/projects/{}/rtls/abr/config/codecs".format(appid)

    # 获取请求的时间戳
    # 后续请求头中会用到 date 字段
    date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')

    # 生成 HMAC 签名
    body_sha256 = sha256(data.encode('utf-8')).digest()
    body_sha256_base64 = base64.b64encode(body_sha256)
    request_line = "{} {} {}".format(req_metd, path, "HTTP/1.1")
    # 生成 digest
    # 后续请求头中会用到 digest 字段
    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
    # 后续请求头中会用到 authorization 字段
    authorization = 'hmac username="{}", algorithm="hmac-sha256", ' \
            'headers="host date request-line digest", signature="{}"'.format(
                    customer_username, signature.decode("utf-8"))

    # 创建连接
    connection = httplib.HTTPSConnection(host, 443)

    # 在请求头中填入之前生成的 date, digest, authorization
    headers = {
        "Date": date,
        "Digest": digest,
        "Authorization": authorization,
        "Content-Type": "application/json"
    }

    # 执行请求
    connection.request(req_metd, path, data, headers)
    response = connection.getresponse()

    # 打印响应状态码和内容
    print("Status: {}".format(response.status))
    print("Response: {}".format(response.read().decode('utf-8')))

    # 关闭连接
    connection.close()

if __name__ == "__main__":
    execute_request_with_hmac()

下一步

开通服务、实现 HTTP HMAC 鉴权后,你可以进行如下操作:

  1. 参考实现观众端多码率了解实现流程。
  2. 参考多码率 RESTful API 说明进行集成。