当前位置: 首页 > article >正文

PHP火山引擎API签名方法

一、前置准备

在开始签名之前,需要准备以下信息:

  1. Access Key ID(AK):请求火山引擎OpenAPI的安全凭证之一。
  2. Secret Access Key(SK):与AK成对使用,用于签名计算。
  3. 请求参数:包括HTTP请求方法、URI、查询参数、请求头等。
二、签名流程(文档地址)

火山引擎API签名流程大致分为以下几个步骤:

  1. 创建规范请求:将请求参数进行规范化处理,形成CanonicalRequest。
  2. 创建待签名字符串:基于CanonicalRequest和其他元数据信息,构建StringToSign。
  3. 派生签名密钥:从SK派生出签名密钥(signing key)。
  4. 计算签名:使用HMAC-SHA256算法和签名密钥,计算StringToSign的签名。
  5. 构建Authorization头:将签名和其他必要信息添加到请求头中。
三、具体实现

以下是一个PHP示例代码,火山引擎API请求生成签名:

/**
 *
 * Author:刘星麟
 * @param $ak   Access Key ID
 * @param $sk   Secret Access Key
 * @param $region   服务Region
 * @param $service  服务名称
 * @param $body     请求参数 没有给空
 * @param $query    接口请求参数
 * @param $method   请求方法  GET|POST
 * @param $path     服务路径
 * @param $headers  服务请求header  签名必要  https://www.volcengine.com/docs/6369/67268#_2-%E7%AD%BE%E5%90%8D%E5%8F%82%E6%95%B0
 * @return mixed
 */
function signv4($ak, $sk, $region, $service, $body, $query, $method, $path, $headers)
{
    if ($path === '') {
        $path = '/';
    }
    
    $ldt = gmdate('Ymd\THis\Z');
    $sdt = substr($ldt, 0, 8);
    $headers['X-Date'] = $ldt;
    $bodyHash = hash('sha256', $body);
    $headers['X-Content-Sha256'] = $bodyHash;
    
    $credentialScope = "$sdt/$region/$service/request";
    $signedHeaders = [];
    foreach ($headers as $key => $value) {
        if ($key == "Host" || $key == "Content-Md5" || $key == "Content-Type" || substr($key, 0, 2) == "X-") {
            $key = strtolower($key);
            $signedHeaders[$key] = $value;
        }
    }
    
    
    ksort($signedHeaders);
    
    $signed_str = '';
    foreach ($signedHeaders as $k => $v) {
        $signed_str .= $k . ':' . $v . "\n";
    }
    
    $signedHeadersString = implode(';', array_keys($signedHeaders));
    $canon = implode("\n", array($method, $path, $query, $signed_str, $signedHeadersString, $bodyHash));
    $hash = hash('sha256', $canon);
    $toSign = implode("\n", array("HMAC-SHA256", $ldt, $credentialScope, $hash));
    $signingKey = getSigningKey($sdt, $region, $service, $sk);
    $signature = hash_hmac('sha256', $toSign, $signingKey);
    $credential = $ak . '/' . $credentialScope;
    $headers['Authorization'] = "HMAC-SHA256 Credential={$credential}, SignedHeaders={$signedHeadersString}, Signature={$signature}";
    return $headers;
}

 function getSigningKey($date, $region, $service, $sk)
{
    $dateKey = hash_hmac('sha256', $date, $sk, true);
    $regionKey = hash_hmac('sha256', $region, $dateKey, true);
    $serviceKey = hash_hmac('sha256', $service, $regionKey, true);
    return hash_hmac('sha256', 'request', $serviceKey, true);
}
 四:演示:获取余额
function curl_data($url, $header = [])
{
    //初始化
    $ch = curl_init();
    // 请求头,可以传数组
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);           //最大相应超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不从证书中检查SSL加密算法是否存在
    $output = curl_exec($ch);
    
    curl_close($ch);
    return $output;
}



$host = 'open.volcengineapi.com';
$service = 'billing';          // 服务名称
$region = 'cn-beijing';        // 区域
$version = '2022-01-01';       // API版本
$action = 'QueryBalanceAcct';  // 操作名称
$path = '/';
$method = 'GET';
$httpBody = '';                 //请求的参数

$ak = 'AKLTM***************************TI';
$sk = 'TV*************************************bE9XVQ==';

//查询参数
$query = http_build_query([
    'Action' => $action,
    'Version' => $version
]);

$url = 'https://' . $host . $path . ($query ? "?{$query}" : ''); //组装请求的地址

//请求header
$headers = [
    'Host' => $host
];

$headerArr = signv4($ak, $sk, $region, $service, $httpBody, $query, $method, $path, $headers);
$header = [];
foreach ($headerArr as $k => $v) {
    $header[] = $k . ":" . $v;
}

$resString = curl_data($url, $header);

正常数据返回格式

{
    "ResponseMetadata": {
        "RequestId": "202308231151163C400BE8545DED89B87D",
        "Action": "QueryBalanceAcct",
        "Version": "2022-01-01",
        "Service": "billing"
    },
    "Result": {
        "AccountID": 210xxxxxxx,
        "ArrearsBalance": "1.01",
        "AvailableBalance": "77.01",
        "CashBalance": "83.01",
        "CreditLimit": "0.01",
        "FreezeAmount": "5.01",
    }
}
五、注意事项
  1. 时间戳:X-Date头必须使用UTC时间,并遵循ISO 8601标准格式。
  2. 请求头排序:参与签名的请求头必须按照ASCII码顺序排序。
  3. 密钥安全:SK是敏感信息,必须妥善保管,避免泄露。
  4. 签名算法:火山引擎目前仅支持HMAC-SHA256算法进行签名。
  5. $body:请求参数 没有一定要给空

http://www.kler.cn/a/584363.html

相关文章:

  • 【Python办公自动化】—Excel中相同编号自动添加-1-2-3...
  • Word中把参考文献引用改为上标
  • 描述K8S创建pod的全过程
  • Linux 系统负载过高的排查思路
  • Secure and Privacy-Preserving Decentralized Federated Learning同态加密联邦学习文献阅读
  • 大数据与区块链——天作之合的技术搭档
  • SiC/GaN器件测试新选择:MHO5000如何破解高频开关噪声难题?
  • android 调用wps打开文档并感知保存事件
  • 吊舱视频参数设置
  • Pygame实现记忆拼图游戏1
  • git 浅克隆及后续分支快速切换
  • (三)穷人技术部署方案:基于K80显卡的DeepSeek-Ollama部署
  • 上海利氪科技-再次续订MappingSpace
  • PHP中的命令行工具开发:构建高效的脚本与工具
  • R格式 | 第十五届蓝桥杯C++B组
  • 深入了解 PyTorch 中的 MaxPool2d 及其池化家族函数
  • 深度学习与大模型-矩阵
  • 排序算法——归并排序(三)
  • 初一信息科技教程专用抓包软件1.4.2版本
  • C#中,如何隐藏TextBox/RichTextBox中闪烁的光标?