活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 安全隔离版OpenClaw NEW OpenClaw云服务器专属“龙虾“套餐低至1.5折起
  • 聚力AI赋能 天翼云大模型专项 大模型特惠专区·Token Plan 轻享包低至9.9元起
  • 青云志云端助力计划 NEW 一站式科研助手,海外资源安全访问平台,助力青年翼展宏图,平步青云
  • 企业出海解决方案 NEW 助力您的业务扬帆出海,通达全球!
  • 天翼云信创专区 NEW “一云多芯、一云多态”,国产化软件全面适配,国产操作系统及硬件芯片支持丰富
  • 中小企业服务商合作专区 国家云助力中小企业腾飞,高额上云补贴重磅上线
  • 云上钜惠 爆款云主机全场特惠,2核4G只要1.8折起!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

息壤智算

领先开放的智算服务平台,提供算力、平台、数据、模型、应用“五位一体”智算服务体系,构建全流程的AI基础设施能力
AI Store
  • 算力市场
  • 模型市场
  • 应用市场
公共算力服务
  • 裸金属
  • 定制裸金属
训推服务
  • 模型开发
  • 训练任务
  • 服务部署
星辰TokenHub
  • 模型广场
  • 体验中心
  • 服务接入
应用托管
  • 应用实例
科研助手
  • 科研智能体
  • 科研服务
  • 开发机
  • 并行计算
大模型
  • DeepSeek-V4-Flash
  • GLM-5.1
  • Qwen3.5-122B-A10B
  • DeepSeek-V3.2(旗舰版)
  • GLM-5(正式版)
智算一体机
  • 智算一体机
智能体引擎
  • 智能体引擎
可信数据空间
  • 可信数据空间
模型适配专家服务
  • 模型适配专家服务
算力服务商
  • 入驻算力服务商

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场进入AI Store创新解决方案公有云生态专区智云上海应用生态专区
建站工具
  • 新域名服务
  • SSL证书
  • 翼建站
企业办公
  • 安全邮箱
  • WPS 365 天翼云版
  • 天翼企业云盘(标准服务版)
灾备迁移
  • 云管家2.0
  • 翼备份(SaaS版)

定价

协助您快速了解云产品计费模式、价格详情,轻松预估上云成本
价格计算器
  • 动态测算产品价格
定价策略
  • 快速了解计费模式

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼信创云专区
  • 信创云专区
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
培训与认证
  • 天翼云学堂
  • 天翼云认证
开源社区
  • 魔乐社区
  • OpenTeleDB

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 服务保障
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家
我要反馈
  • 建议与反馈
  • 用户体验官
信息公告
  • 客户公告

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2026智能云生态大会
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 息壤智算
  • 产品
  • 解决方案
  • 应用商城
  • 定价
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      星辰MaaS模型服务平台

      星辰MaaS模型服务平台

      • 星辰MaaS模型服务平台

      无数据

        • 产品介绍
        • 产品定义
        • 产品优势
        • 术语解释
        • 模型使用限制
        • 计费说明
        • 模型推理计费规则
        • 模型训推计费规则
        • 欠费说明
        • 账单和发票
        • 快速入门
        • 准备工作
        • 快速入门
        • 用户指南
        • 模型广场
        • 体验中心
        • 数据管理
        • 公共数据集
        • 我的数据集
        • 模型推理
        • 模型训练
        • 模型调优
        • 我的模型
        • 模型部署
        • 服务部署
        • 模型量化
        • 系统管理
        • API Key
        • 操作日志
        • 常见问题
        • 常见问题
        • 最佳实践
        • 零门槛CV大模型训推
        • API参考
        • 开发指南
        • 开发指南
        • 异步调用结果获取
        • 大模型异步调用结果回查
        • 状态码说明
        • 实时超自然语音合成-普通话版
        • 能力介绍
        • 接口文档
        • 超多方言实时语音识别
        • 能力介绍
        • 接口文档
        • 通用问答版大模型-36B
        • 能力介绍
        • 接口文档
        • 对话大模型
        • 能力介绍
        • 接口文档
        • 文生图大模型
        • 能力介绍
        • 接口文档
        • 图生图大模型
        • 能力介绍
        • 接口文档
        • 文档下载
        • 相关协议
        • 星辰MaaS模型推理服务协议
        • 星辰MaaS模型推理服务用户信息处理规则
        • 生成式人工智能服务备案信息参考
        • 星辰MaaS模型定制开发服务协议
          无相关产品

          本页目录

          帮助中心 星辰MaaS模型服务平台 API参考 开发指南 开发指南
          开发指南
          更新时间 2026-06-05 17:10:07
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2026-06-05 17:10:07
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接

          接口信息

          API Path 

          签名认证方式

          详细说明:

          鉴权目标

          本鉴权目的在于为星辰MaaS模型服务平台的鉴权做增强鉴权认证体系,为了系统提供更加高效安全的通信方式。

          调用地址

          公网域名:xirang-openapi.ctyun.cn  端口:443 接口地址:查看每个接口文档的头部连接地址

          请求地址:https://xirang-openapi.ctyun.cn:443/{接口地址}

          请求头说明

          请求头Header传入如下字段,字段说明见下表格

          字段名是否必填字段说明
          Authorization是签名
          X-APP-ID是用户申请的账号ID
          OrderNum否订单号

          Authorization生成方式

          Authorization={originName}/{X-APP-ID}/{region}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature} 其中

          • originName 公网环境为:teleai-cloud-auth-v1

          • region 所请求服务资源所在的区域 ,可使用省份缩写拼音(见本文后面的省份列表)

          • timestamp 为10位的unix 时间锁 例如:1728892448

          • expirationPeriodInSeconds签名有效期限从timestamp所指定的时间开始计算,单位为秒

          • signedHeaders:推荐默认值直接给【x-app-id】

          • signature: 256位签名的十六进制表示,由64个小写字母组成。它由SK(X-APP-KEY)和authStringPrefix哈希得到signingKey,再将canonicalRequest以signingKey为key进行哈希摘要生成,具体算法见下。

          附录:

          省份拼音缩写表

          编码省市缩写
          000000全国QG
          110000北京市BJ
          120000天津市TJ
          130000河北省HE
          140000山西省SX
          150000内蒙古NM
          210000辽宁省LN
          220000吉林省JL
          230000黑龙江HL
          310000上海市SH
          320000江苏省JS
          330000浙江省ZJ
          340000安徽省AH
          350000福建省FJ
          360000江西省JX
          370000山东省SD
          410000河南省HA
          420000湖北省HB
          430000湖南省HN
          440000广东省GD
          450000广西省GX
          460000海南省HI
          500000重庆市CQ
          510000四川省SC
          520000贵州省GZ
          530000云南省YN
          540000西藏XZ
          610000陕西省SN
          620000甘肃省GS
          630000青海省QH
          640000宁夏NX
          650000新疆XJ
          710000台湾省TW
          810000香港HK
          820000澳门MO

          代码示例

          java生成签名工具类

          package cn.chinatelecom.teleai.utils;
          
          import cn.hutool.core.util.StrUtil;
          import lombok.extern.slf4j.Slf4j;
          import org.springframework.http.HttpHeaders;
          import org.springframework.http.HttpMethod;
          
          import javax.crypto.Mac;
          import javax.crypto.spec.SecretKeySpec;
          import java.io.UnsupportedEncodingException;
          import java.net.URLEncoder;
          import java.util.*;
          
          
          
          
          @Slf4j
          public class SignUtils {
          
          
          
              String str ;
          
              // 授权字符串字段数
              public static final int AUTHORIZATION_ITEM_NUM = 7;
              // HMAC SHA256 算法常量
              private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
          
              public static final List<String> DEFAULT_HEADERS = Arrays.asList(
                      HttpHeaders.HOST,
                      HttpHeaders.CONTENT_TYPE,
                      HttpHeaders.CONTENT_LENGTH,
                      "Content-Md5");
          
              /**
               * 生成签名
               * @param signPrefix  签名前缀
               * @param appKey  应用密钥
               * @param method  HTTP请求方法
               * @param path    HTTP请求uri
               * @param params  HTTP请求参数
               * @param headers HTTP请求headers
               * @return 生成的签名
               */
              public static String genSignature(String signPrefix,String appKey, HttpMethod method, String path,
                                                Map<String, String> params, Map<String, String> headers,String signedHeaders) {
          
                  // 格式化基础签名信息
                  String signingKey;
                  try {
                      // 生成签名密钥
                      signingKey = generateHmacSHA256Hex(signPrefix, appKey);
                  } catch (Exception e) {
                      log.error("{signPrefix}/{X-APP-ID}/{region}/{timestamp}/{expirationPeriodInSeconds}签名错误", e);
                      throw new RuntimeException(e);
                  }
                  log.info("appKey:[{}] signingKey:[{}]",appKey,signingKey);
                  // 获取规范化的请求字符串
                  String canonicalRequest = getCanonicalRequest(method, path, params, headers,signedHeaders);
                  log.info("请求内容签名信息 canonicalRequest:换行符{}",canonicalRequest);
                  String signature;
                  try {
                      // 生成最终签名
                      signature = generateHmacSHA256Hex(canonicalRequest, signingKey);
                  } catch (Exception e) {
                      log.error("canonicalRequest 签名错误", e);
                      throw new RuntimeException(e);
                  }
                  return signature;
              }
          
              /**
               * 获取规范化的请求字符串
               *
               * @param method  HTTP请求方法
               * @param path    HTTP请求uri
               * @param params  HTTP请求参数
               * @param headers HTTP请求headers
               * @param signedHeaders 签名头
               * @return 规范化的请求字符串
               */
              private static String getCanonicalRequest(HttpMethod method, String path, Map<String, String> params,
                                                        Map<String, String> headers, String signedHeaders) {
                  // 构建规范化的请求字符串
                  StringBuilder canonicalRequest = new StringBuilder();
                  canonicalRequest.append(method).append("换行符");
                  String canonicalURI;
                  try {
                      // 规范化请求URI
                      canonicalURI = URLEncoder.encode(path, "utf-8").replaceAll("%2F", "/");
                  } catch (UnsupportedEncodingException e) {
                      log.error("url encode error", e);
                      throw new RuntimeException(e);
                  }
                  canonicalRequest.append(canonicalURI).append("换行符");
          
                  // 获取规范化查询字符串
                  canonicalRequest.append(getCanonicalQueryString(params)).append("换行符");
          
                  // 获取规范化请求头
                  String canonicalHeaders = getCanonicalHeaders(headers,signedHeaders);
                  canonicalRequest.append(canonicalHeaders);
                  return canonicalRequest.toString();
              }
          
              /**
               * 获取规范化的查询字符串
               *
               * @param paramMap 查询参数映射
               * @return 规范化的查询字符串
               */
              private static String getCanonicalQueryString(Map<String, String> paramMap) {
                  List<String> params = new ArrayList<>();
                  for (Map.Entry<String, String> param : paramMap.entrySet()) {
                      String key = param.getKey();
                      String value = param.getValue();
                      try {
                          params.add(URLEncoder.encode(key, "UTF-8") + "=" + (StrUtil.isNotBlank(value) ? URLEncoder.encode(value, "UTF-8") : ""));
                      } catch (UnsupportedEncodingException e) {
                          log.error("params encode error", e);
                          throw new RuntimeException(e);
                      }
                  }
                  // 按字母顺序排序查询参数
          //        params.sort(String.CASE_INSENSITIVE_ORDER);
                  Collections.sort(params);
                  return StrUtil.join( "&",params);
              }
          
              /**
               * 获取规范化的请求头
               * @param headerMap 请求头映射
               * @param signedHeaders 签名头
               * @return 规范化的请求头字符串
               */
              private static String getCanonicalHeaders(Map<String, String> headerMap, String signedHeaders) {
                  if (headerMap.isEmpty()) {
                      return "";
                  }
                  // 将请求头键名转换为小写
                  Map<String, String> lowerCaseHeaderMap = new HashMap<>();
                  for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                      lowerCaseHeaderMap.put(entry.getKey().toLowerCase(), entry.getValue());
                  }
          
                  List<String> headerList = new ArrayList<>();
                  List<String> headerNames;
                  if (StrUtil.isNotBlank(signedHeaders)) {
                      headerNames = StrUtil.split(signedHeaders,";");
                  } else {
                      headerNames = DEFAULT_HEADERS;
                  }
                  for (String headerName : headerNames) {
                      String lowerCaseHeaderName = headerName.trim().toLowerCase();
                      String headerValue = lowerCaseHeaderMap.get(lowerCaseHeaderName);
                      if (StrUtil.isNotBlank(headerValue)) {
                          try {
                              headerList.add(lowerCaseHeaderName + ":" + StrUtil.trim(URLEncoder.encode(headerValue, "UTF-8")));
                          } catch (UnsupportedEncodingException e) {
                              log.error("headers encode error", e);
                              throw new RuntimeException(e);
                          }
                      }
                  }
                  // 按字母顺序排序请求头
          //        headerList.sort(String.CASE_INSENSITIVE_ORDER);
                  Collections.sort(headerList);
                  return StrUtil.join("换行符",headerList );
              }
          
              /**
               * 生成一个 HmacSHA256 哈希值。
               *
               * @param data 要进行哈希处理的数据。
               * @param key  用于哈希处理的密钥。
               * @return 生成的 HmacSHA256 哈希值,以十六进制编码表示。
               * @throws Exception 如果哈希处理失败,则抛出异常。
               */
              private static String generateHmacSHA256Hex(String data, String key) throws Exception {
                  SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA256_ALGORITHM);
                  Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
                  mac.init(signingKey);
                  byte[] rawHmac = mac.doFinal(data.getBytes());
                  return bytesToHex(rawHmac);
              }
          
              /**
               * 将字节数组转换为十六进制字符串。
               *
               * @param bytes 要转换的字节数组。
               * @return 字节数组的十六进制表示。
               */
              private static String bytesToHex(byte[] bytes) {
                  StringBuilder hexString = new StringBuilder();
                  for (byte b : bytes) {
                      String hex = Integer.toHexString(0xff & b);
                      if (hex.length() == 1) {
                          hexString.append(\'0\');
                      }
                      hexString.append(hex);
                  }
                  return hexString.toString();
              }
          
              public static void main(String[] args) {
                  //特此声明里边的值需要根据需求进行替换
                  //时间戳
                  long l = System.currentTimeMillis() / 1000L;
                  //这里因为没有引入Request 所以模拟header的map
                  Map<String, String> headerMap = new HashMap<>();
                  //这里根据文档里的描述,这里需要根据实际需求进行修改(推荐使用 x-app-id)
                  String signedheaders = "x-app-id";
                  //如果signedheaders  有多个那么这里需要都塞进去  同样的 当你使用request的请求的时候 你的signedheaders里的key在header都需要具备
                  headerMap.put("X-APP-ID", "用户申请的账号ID");        
                  //根据文档进行替换,所请求服务资源所在的区域,可使用所在省份缩写(见本文后面的省份列表)
                  String region="HN";
                  String appId="yourAPPID";
                  String basic = "teleai-cloud-auth-v1/"+appId+"/"+region+"/"+l+"/180000";        
                  //这里是接口的param  param指的是 路径后缀 使用?后面的参数 同样的如果使用request的话 使用了url拼接?key=value 那么加密必须使用
                  //这里模拟的是不具备?的情况所以塞了一个空的map
                  Map<String,String> params = new HashMap<>();
                  String sign = SignUtils.genSignature(
                          basic,
                          //X-APP-KEY,对应账号信息中的key值
                          "yourAPPKEY",
                          //请求的发送方式   POST GET 等 websocket 是GET,需要与算法的请求方式保持一致
                          HttpMethod.POST,
                          //请求路径的path
                          "/aipaas/cv/v1/image/cyclistsHelmetDetect",
                          params,
                          headerMap,
                          signedheaders);
          
                  System.out.println(sign);
                  //生成的就是 Authorization 注意生成的有斜杠进行拼接
                  System.out.println(String.format("Authorization: %s/%s/%s",basic,signedheaders,sign));
              }
          }
          
          ~~~~

          shell脚本

          #!/bin/bash
          
          # Function to URL encode a string
          url_encode() {
              local string="${1}"
              local strlen=${#string}
              local encoded=""
          
              for (( pos=0; pos<strlen; pos++ )); do
                  c=${string:pos:1}
                  case "$c" in
                      [a-zA-Z0-9.~_-])
                          encoded+="$c"
                          ;;
                      *)
                          printf -v encoded \'%s%%%02X\' "$encoded" "\'$c"
                          ;;
                  esac
              done
              echo "$encoded"
          }
          
          # Function to generate HMAC SHA256 signature
          generate_hmac_sha256() {
              local data="${1}"
              local key="${2}"
              echo -n "$data" | openssl dgst -sha256 -hmac "$key" | sed \'s/^.* //\'
          }
          
          # Function to get canonical query string
          get_canonical_query_string() {
              local param_string="$1"
              local param_list=()
          
              IFS=\'&\' read -ra param_pairs <<< "$param_string"
              for param_pair in "${param_pairs[@]}"; do
                  IFS=\'=\' read -ra param <<< "$param_pair"
                  key=${param[0]}
                  value=${param[1]}
                  encoded_key=$(url_encode "$key")
                  encoded_value=$(url_encode "$value")
                  param_list+=("${encoded_key}=${encoded_value}")
              done
              #echo "param_list: ${param_list[@]}"
              sort_params=($(for i in "${param_list[@]}"; do echo $i; done | sort))
              #echo "sort_params: ${sort_params[@]}"
              query_string=$(IFS="&"; echo "${sort_params[*]}")
              echo "$query_string"
          }
          
          # Function to get canonical headers
          get_canonical_headers() {
              local header_string="$1"
              local signed_headers="$2"
              local header_list=()
              IFS=\';\' read -ra headers <<< "$signed_headers"
              for header_name in "${headers[@]}"; do
                  IFS=\';\' read -ra header_pairs <<< "$header_string"
                  for header_pair in "${header_pairs[@]}"; do
                      IFS=\'=\' read -ra kv <<< "$header_pair"
                      name=$(echo "${kv[0]}" | tr \'[:upper:]\' \'[:lower:]\')
                      value=${kv[1]}
                      if [[ "$name" == "$header_name" ]]; then
                          hearder_value=$(url_encode "$value")
                          header_list+=("${header_name}:${hearder_value}")
                      fi
                  done
              done
              #echo "header_list: ${header_list[@]}"
              sort_headers=($(for i in "${header_list[@]}"; do echo $i; done | sort))
              #echo "sort_headers: ${sort_headers[@]}"
              printf "%s
          " "${sort_headers[@]}"
          }
          
          # Function to generate canonical request
          get_canonical_request() {
              local method="$1"
              local path="$2"
              local param_string="$3"
              local header_string="$4"
              local signed_headers="$5"
              local canonicalURI=$(url_encode "$path" | sed \'s/%2F///g\')
              local canonicalQueryString=$(get_canonical_query_string "$param_string")
              local canonicalHeaders=$(get_canonical_headers "$header_string" "$signed_headers")
              printf "%s
          %s
          %s
          %s" "$method" "$canonicalURI" "$canonicalQueryString" "$canonicalHeaders"
          }
          
          # Function to generate the signature
          gen_signature() {
              local appkey="$1"
              local method="$2"
              local path="$3"
              local params="$4"
              local headers="$5"
              local prefix="$6"
              local auth_appid="$7"
              local region="$8"
              local timestamp="$9"
              local expiration="${10}"
              local signed_headers="${11}"
              local basic="${prefix}/${auth_appid}/${region}/${timestamp}/${expiration}"
              #echo "basic: $basic"
              local canonical_request=$(get_canonical_request "$method" "$path" "$params" "$headers" "$signed_headers")
              #echo "Canonical Request:  $canonical_request"
          
              local signing_key=$(generate_hmac_sha256 "$basic" "$appkey")
              #echo "signing_key: $signing_key"
              local signature=$(generate_hmac_sha256 "$canonical_request" "$signing_key")
          
              echo "$signature"
          }
          
          # Main function to verify the authorization
          verify_auth() {
              local authorization="$1"
              local appid="$2"
              local appkey="$3"
              local method="$4"
              local path="$5"
              local params="$6"
              local headers="$7"
              echo "authorization: $authorization"
              IFS=\'/\' read -ra auth_parts <<< "$authorization"
              prefix="${auth_parts[0]}"
              auth_appid="${auth_parts[1]}"
              region="${auth_parts[2]}"
              timestamp="${auth_parts[3]}"
              expiration="${auth_parts[4]}"
              signed_headers="${auth_parts[5]}"
              signature="${auth_parts[6]}"
              echo "signature: $signature"
              if [[ "$prefix" != "eop-auth-v1" ]]; then
                  echo "Invalid prefix: $prefix"
                  return 1
              fi
          
              if [[ "$appid" != "$auth_appid" ]]; then
                  echo "AppID mismatch: $auth_appid != $appid"
                  return 1
              fi
          
              current_time=$(date +%s)
              if (( timestamp + expiration < current_time )); then
                  echo "Request expired"
                  return 1
              fi
          
              server_signature=$(gen_signature "$appkey" "$method" "$path" "$params" "$headers" "$prefix" "$auth_appid" "$region" "$timestamp" "$expiration" "$signed_headers")
              echo "server_signature: $server_signature"
              if [[ "$signature" != "$server_signature" ]]; then
                  echo "Signature verification failed"
                  return 1
              fi
          
              echo "Signature verification succeeded"
              return 0
          }
          
          # Example usage of gen_signature
          method="POST"
          path="/v1/test"
          params="aa=bb"
          headers="date=Mon, 27 Apr 2015 16:23:49 +0800;content-type=text/plain;content-length=8"
          
          prefix="eop-auth-v1"
          auth_appid="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
          appkey="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
          region="BJ"
          timestamp="1729067670"
          expiration="1800"
          signed_headers="content-length;content-type;host"
          
          signature=$(gen_signature "$appkey" "$method" "$path" "$params" "$headers" "$prefix" "$auth_appid" "$region" "$timestamp" "$expiration" "$signed_headers")
          echo "Generated Signature: $signature"
          
          # # Example usage of verify_auth
          authorization="${prefix}/${auth_appid}/${region}/${timestamp}/${expiration}/${signed_headers}/${signature}"
          verify_auth "$authorization" "$auth_appid" "$appkey" "$method" "$path" "$params" "$headers"

          python 脚本

          import json
          import hashlib
          import hmac
          import time
          import urllib.parse
          
          # 配置环境变量(密钥、区域等))X-APP-ID对应账号信息中的ID值,X-APP-KEY对应账号信息中的KEY值
          X_APP_ID = \'yourXAppId\'
          X_APP_KEY = \'yourXAppKey\'
          
          # URL 和请求数据
          REGION = \'QG\'
          EXPIRATION_IN_SECONDS = \'43200\'  # 默认过期时间,这里配置12小时
          TIMESTAMP = str(int(time.time()))  # 当前时间戳
          SIGNED_HEADERS = \'x-app-id\'  # 默认签名头
          PUBLIC_NETWORK_SING_HEADER = \'teleai-cloud-auth-v1\'  # 公网鉴权头部,按照实际调用情况选择
          EMS_SING_HEADER = \'eop-auth-v1\'  # 内网鉴权头部,按照实际调用情况选择
          
          # 构建请求头
          headers = {
              \'Content-Type\': \'application/json\',
              \'X-APP-ID\': X_APP_ID,
          }
          
          
          class HttpAuth(object):
              # 编码函数
              def normalize(self, string, encoding_slash=True):
                  quoted_string = urllib.parse.quote(string, safe=\'~()*!\'/\' if encoding_slash else \'~()*!\'\')
                  return quoted_string
          
              # 生成Canonical URI
              def generate_canonical_uri(self, url):
                  parsed_url = urllib.parse.urlparse(url)
                  return \'/\'.join(self.normalize(segment, False) for segment in parsed_url.path.split(\'/\'))
          
              # 生成Canonical Headers
              @staticmethod
              def generate_canonical_headers(input_params):
                  signed_headers_list = SIGNED_HEADERS.split(\';\')
                  signed_headers_set = set(signed_headers_list)
                  sorted_headers = sorted((k.lower(), urllib.parse.quote(v.strip(), safe=\'\')) for k, v in input_params.items() if
                                          k.lower() in signed_headers_set)
                  canonical_headers = \'
          \'.join(f"{k}:{v}" for k, v in sorted_headers)
                  signed_headers_str = \';\'.join(sorted(signed_headers_set))
                  print("canonical_headers:", canonical_headers)
                  return canonical_headers, signed_headers_str
          
              # 生成签名
              def generate_signature(self, x_app_id, x_app_key, region, timestamp, expiration_in_seconds, method,
                                     canonical_uri,
                                     canonical_headers, signed_headers_str, canonical_query_string):
                  # 在此处选择对应的鉴权头部
                  signing_key_str = f"{PUBLIC_NETWORK_SING_HEADER}/{x_app_id}/{region}/{timestamp}/{expiration_in_seconds}"
          
                  signing_key = hmac.new(bytes(x_app_key, \'utf-8\'), bytes(signing_key_str, \'utf-8\'), hashlib.sha256).hexdigest()
          
                  # print(f"signing_key = {signing_key}")
                  canonical_request = f"{method.upper()}
          {canonical_uri}
          {canonical_query_string}
          {canonical_headers}"
                  print("canonical_request 
          ", canonical_request)
                  signature = hmac.new(bytes(signing_key, \'utf-8\'), bytes(canonical_request, \'utf-8\'), hashlib.sha256).hexdigest()
                  authorization = f"{signing_key_str}/{signed_headers_str}/{signature}"
                  # print("authorization", authorization)
                  return authorization
          
              # 获取Content-Length
              def get_content_length(self, data):
                  body = json.dumps(data)
                  return str(len(body))
          
              # 发送请求并获取响应
              def get_auth(self, url, method, canonical_query_string):
                  """
                  主逻辑
          
                  :param url: 完整的请求url
                  :param method: GET/POST,根据实际情况传入,websocket请求传GET
                  :param canonical_query_string: params参数,GET请求需要传入,格式为key=value,其他请求请传入\'\'
                  """
                  canonical_uri = self.generate_canonical_uri(url)
          
                  canonical_headers, signed_headers_str = self.generate_canonical_headers(headers)
                  authorization = self.generate_signature(X_APP_ID, X_APP_KEY, REGION, TIMESTAMP, EXPIRATION_IN_SECONDS,
                                                          method, canonical_uri, canonical_headers, signed_headers_str, canonical_query_string)
                  headers[\'Authorization\'] = authorization
                  print(f"authorization = {authorization}")
                  return headers
          
          
          getAuth = HttpAuth()
          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  开发指南
          下一篇 :  异步调用结果获取
          搜索 关闭
          ©2026 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2026天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明