Miku 直播

  • Miku 直播 > API 文档 > API请求鉴权

    API请求鉴权

    最近更新时间: 2025-11-21 11:14:11

    七牛云 MLS API 鉴权指南

    本文档介绍三种常用的 MLS API 鉴权方式:

    1. AK/SK 签名鉴权(QiniuToken)
    2. IAM 子账号鉴权
    3. Bearer Token 鉴权

    每种方式都提供签名生成规则和请求示例。


    1 AK/SK 签名鉴权(QiniuToken)

    七牛云管理 API 请求必须经过 AK/SK 签名生成 QiniuToken,并在 Authorization 头中使用。

    1.1 获取密钥

    1. 登录 七牛开发者平台
    2. 打开 个人中心 → 密钥管理
    3. 获取 AccessKeySecretKey

    注意:密钥非常重要,请勿放在客户端或公开仓库。

    1.2 构造待签名字符串

    签名字符串规则:

    data = <Method> + " " + <Path> + "?" + <RawQuery> + "\nHost: " + <Host> + "\nContent-Type: " + <contentType> + "\n\n" + <bodyStr> 

    注意:1.< Method > 与 < Path > 中间有一个空格

    参数说明:

    参数 必填 说明
    Method HTTP 方法:GET/POST/PUT/DELETE,大写
    Path 请求路径,如 /v2/hubs/PiliSDKTest/streams/xxx
    RawQuery URL 查询参数,如无可不加 ?
    Host 域名,如 mls.cn-east-1.qiniumiku.com
    Content-Type 请求体类型,如为空可不加该字段
    bodyStr 请求体内容,如有且 Content-Type 不为空且不为 application/octet-stream,需加入

    注意:无论 Content-Type 或 body 是否为空,中间都必须保留 \n\n

    1.3 计算签名

    使用 HMAC-SHA1 算法并进行 URL-safe Base64 编码:

    sign = hmac_sha1(data, "Your_Secret_Key") encodedSign = urlsafe_base64_encode(sign) 

    1.4 生成 QiniuToken

    QiniuToken = "Qiniu " + "<AccessKey>" + ":" + "<encodedSign>" 

    1.5 请求示例

    ak = test1
    sk = test2
    QiniuToken = “Qiniu test1:KI-VgUTKszBmF2b0r3ssQMbnA5Q=”

    curl -v -XPOST 'http://mls.cn-east-1.qiniumiku.com/?apikey' \ -d '{"name": "test"}' \ -H 'Authorization: Qiniu test1:KI-VgUTKszBmF2b0r3ssQMbnA5Q=' \ -H 'Host: mls.cn-east-1.qiniumiku.com' \ -H 'Content-Type: application/json' 

    Go 语言示例:

    package main import (	"crypto/hmac"	"crypto/sha1"	"encoding/base64"	"fmt"	"io"	"net/http"	"net/url"	"os"	"strings"	"time" ) func main() {	// 从环境变量获取Access Key和Secret Key	ak := os.Getenv("Access_key")	sk := os.Getenv("Secret_key")	// 请求体	body := `{"data":{"uri":"http://oayjpradp.bkt.clouddn.com/Audrey_Hepburn.jpg"},"params":{"scenes":["pulp","terror","politician","ads"]}}`	// 构建HTTP请求	targetURL := "http://ai.qiniuapi.com/v3/image/censor"	// 生成签名并发送请求	signature := generateSignature("POST", targetURL, body, ak, sk)	fmt.Printf("生成的签名: %s\n", signature)	response, err := sendHttpRequest(targetURL, "POST", body, signature, 2)	if err != nil {	fmt.Printf("请求失败: %v\n", err)	return	}	fmt.Printf("响应内容: %s\n", response) } // generateSignature 生成七牛签名 func generateSignature(method, urlStr, body, ak, sk string) string {	parsedURL, err := url.Parse(urlStr)	if err != nil {	panic(err)	}	// 构建签名数据	var data strings.Builder	data.WriteString(method)	data.WriteString(" ")	data.WriteString(parsedURL.Path)	if parsedURL.RawQuery != "" {	data.WriteString("?")	data.WriteString(parsedURL.RawQuery)	}	data.WriteString("\nHost: ")	data.WriteString(parsedURL.Host)	data.WriteString("\nContent-Type: application/json")	data.WriteString("\n\n")	if body != "" {	data.WriteString(body)	}	// 使用HMAC-SHA1进行签名	hmacSha1 := hmac.New(sha1.New, []byte(sk))	hmacSha1.Write([]byte(data.String()))	hmacResult := hmacSha1.Sum(nil)	sign := "Qiniu " + ak + ":" + base64UrlSafeEncode(hmacResult)	return sign } // sendHttpRequest 发送HTTP请求 func sendHttpRequest(urlStr, method, data, signature string, timeout int) (string, error) {	client := &http.Client{	Timeout: time.Duration(timeout) * time.Second,	}	var bodyReader io.Reader	if data != "" {	bodyReader = strings.NewReader(data)	}	req, err := http.NewRequest(method, urlStr, bodyReader)	if err != nil {	return "", err	}	req.Header.Set("Content-Type", "application/json")	req.Header.Set("Authorization", signature)	resp, err := client.Do(req)	if err != nil {	return "", err	}	defer resp.Body.Close()	bodyBytes, err := io.ReadAll(resp.Body)	if err != nil {	return "", err	}	return fmt.Sprintf("HTTP %d: %s", resp.StatusCode, string(bodyBytes)), nil } // base64UrlSafeEncode URL安全的base64编码 func base64UrlSafeEncode(data []byte) string {	encoded := base64.StdEncoding.EncodeToString(data)	encoded = strings.ReplaceAll(encoded, "+", "-")	encoded = strings.ReplaceAll(encoded, "/", "_")	return encoded } 

    2 Bearer Token 鉴权(API Key)

    通过管理员 AK/SK 生成 API Key,然后使用 Bearer Token 调用 API。

    2.1 创建 API Key

    curl -v -XPOST 'http://mls.cn-east-1.qiniumiku.com/?apikey' \ -d '{"name": "name"}' \ -H 'Authorization: Qiniu <AK/SK签名生成的Token>' \ -H 'Content-Type: application/json' 

    注意:name 自定义,长度 1~20,内容不做校验。

    2.2 使用 API Key 调用接口

    curl https://mls.cn-east-1.qiniumiku.com/stream?info=test \ -H "Authorization: Bearer <Miku API Key>" 

    可以通过调用 api 获取创建的 apikey 列表或者通过 miku portal 创建对应的 apikey

    3 IAM 子账号鉴权

    IAM 子账号可访问 Miku 的 S3 风格接口,签名方式与 AK/SK 相同。

    3.1 S3 风格接口示例

    • 普通接口:
    https://domain/{bucket}/{streamtitle}/path?params={params}&params2={params2} 
    • S3 风格接口:
    https://{bucket}.domain/{streamtitle}?path&params={params}&params2={params2} 

    3.2 请求示例

    curl -v 'http://mls.cn-east-1.qiniumiku.com/?trafficStats&begin=20240101000000&end=20240129105148&g=5min&select=flow&flow=downflow' \ -H 'Content-Type: application/json' \ -H 'Authorization: Qiniu <IAM-AccessKey>:<signToken>' 

    注意:签名生成方式与 AK/SK QiniuToken 完全一致,只是 AccessKey 和 SecretKey 使用子账号凭证。


    总结

    1. AK/SK 签名:管理类 API 使用,生成 QiniuToken
    2. IAM 子账号:适用于 S3 风格接口
    3. Bearer Token:基于 API Key 调用接口

    关键点

    • Method / Path / Query / Host / Content-Type / Body 必须与签名一致
    • HMAC-SHA1 输出必须 URL-safe Base64 编码
    以上内容是否对您有帮助?