API调用者需要将AppKey和AppSecret对请求进行加密签名,API网关收到请求后按相同算法计算签名并比对——匹配放行、否则拒绝,这是华为云API网关APP认证的核心安全机制。这份2026年5月的开发指南详细拆解了APP认证的完整签名流程:从构造规范请求的6个组件(HTTP方法、URI、查询字符串、消息头、签名头声明、请求体哈希)到创建待签字符串,再到HMAC-SHA256签名计算和Authorization头添加。覆盖Java、Go、Python、C、JavaScript、PHP、C++、C、Android、curl共10种语言SDK的集成方式,以及后端服务对签名请求的校验逻辑。
APP认证的核心流程与签名原理
APP认证(签名认证)要求API调用者使用API所授权凭据的Key和Secret,对API请求进行加密签名。AppKey是访问密钥ID,AppSecret是与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方并防止请求被修改。认证前需要准备:API的请求信息(域名、请求路径和请求方法)、API已发布的环境、以及凭据的Key和Secret。
认证工作原理分为6步:①客户端构造规范请求(CanonicalRequest);②使用规范请求和其他信息创建待签字符串(StringToSign);③使用AK/SK和待签字符串计算签名;④将生成的签名信息作为Authorization消息头添加到HTTP请求中;⑤API网关收到请求后执行①~③计算签名;⑥将网关计算的签名与客户端签名比对——匹配则处理请求,否则拒绝。客户端须注意本地时间与时钟服务器的同步,API网关会校验时间差,大于15分钟将拒绝请求。
规范请求构造的6个组件详解
规范请求(CanonicalRequest)由6个组件以换行符拼接而成,伪代码为:CanonicalRequest = HTTPRequestMethod + "\n" + CanonicalURI + "\n" + CanonicalQueryString + "\n" + CanonicalHeaders + "\n" + SignedHeaders + "\n" + HexEncode(Hash(RequestPayload))。
HTTP请求方法如GET、PUT、POST等。规范URI是请求资源路径的URI编码,根据RFC3986标准化,移除冗余和相对路径部分,每个部分必须为URI编码,以“/”结尾。规范查询字符串对所有参数名和值进行URI编码,按字符代码升序排序,用“=”连接名和值,多个参数用“&”连接。规范消息头包含X-Sdk-Date(格式YYYYMMDDTHHMMSSZ),消息头名称转小写并按升序排序,值去除前后空格,每个头以“\n”结尾。SignedHeaders声明哪些头参与签名,X-Sdk-Date必须包含,多个头用“;”分隔。请求体哈希使用SHA-256算法,空字符串的哈希值为固定值。
10种语言SDK集成方案
Java SDK基于Maven工程,核心类HttpClientDemo.java和OkHttpDemo.java,需引入java-sdk-core-x.x.x.jar,AK/SK通过环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK传入,示例代码设置了请求的key、secret、method、url和body后调用Client.sign进行签名。Go SDK核心代码在signer.go,使用core.Signer结构体,通过os.Getenv获取环境变量,调用s.Sign(r)完成签名。Python SDK通过apig_sdk.signer模块,使用signer.Signer()生成签名对象,调用sig.Sign(r)后使用requests库发送请求。
C SDK包含apigateway-signature(签名共享库)、sdk-request(调用示例)和backend-signature(后端签名示例)三个项目,使用Signer.Sign方法生成HttpWebRequest。JavaScript SDK支持Node.js和浏览器环境,Node.js使用signer.js模块和https.request发送请求,浏览器需配置跨域共享策略后使用XMLHttpRequest。PHP SDK通过signer.php引入,使用Signer类和Request类,Sign方法生成curl上下文。C++和C SDK需安装openssl和curl库,通过Makefile编译,C++使用RequestParams类,C使用sig_params_t结构体。Android SDK在app/libs目录下引入java-sdk-core-x.x.x.jar,使用okhttp3.Request发送签名请求。curl方式通过JavaScript SDK的demo.html填入Key、Secret、Method、Url后生成curl命令直接执行。
后端签名校验与安全要点
API绑定签名密钥后,API网关向后端发送请求时会携带签名信息。后端服务需集成SDK对签名进行校验。校验流程:从Authorization头解析signingKey和signedHeaders,通过signingKey查找对应的signingSecret,按相同算法重新计算签名并与客户端签名比对。需要检查X-Sdk-Date时间戳与服务器时间差不超过15分钟,signedHeaders中声明的所有头域必须存在。对于需要读取Body的场景,需将HttpServletRequest包装为可重复读取的包装类(如RequestWrapper),因为输入流默认只能读取一次。
安全要点:AK/SK禁止硬编码在代码中,应通过环境变量或配置文件密文存储;时间戳与服务器时间差不能超过15分钟;Authorization头格式必须严格符合规范;签名密钥应定期轮换;企业联邦用户不能创建访问密钥但可创建临时访问凭证。三语言后端校验示例覆盖了Java Spring Boot(Filter)、Python Flask(装饰器)、C ASP.NET Core(IAuthorizationFilter),展示了主流后端框架与API网关签名机制的集成模式。