API签名认证要求调用者在请求中携带使用HMAC-SHA256算法计算的签名信息,API网关收到请求后按相同算法验证签名——这是一套对称的加密认证机制。华为云这份开发指南提供了10种语言/工具的SDK实现:Java的HttpClientDemo和OkHttpDemo、Go的core.Signer、Python的apig_sdk.signer、C的apigateway-signature共享库、JavaScript的Node.js和浏览器双环境支持、PHP的signer类、C++和C的Makefile编译方案、Android的okhttp3集成。每种SDK都遵循相同的签名核心逻辑:构造规范请求→创建待签字符串→HMAC-SHA256计算→添加Authorization头。
SDK的核心逻辑与统一签名算法
所有语言SDK遵循统一的签名算法流程。第一步构造规范请求(CanonicalRequest):HTTP方法、URI(以/结尾)、查询字符串(参数按字母排序)、消息头(X-Sdk-Date必含,头名小写排序)、签名头声明(X-Sdk-Date必含)、请求体SHA-256哈希。第二步创建待签字符串(StringToSign):Algorithm + "\n" + RequestDateTime + "\n" + HashedCanonicalRequest,Algorithm固定为“SDK-HMAC-SHA256”。第三步计算签名:HMAC-SHA256(AppSecret, StringToSign),输出十六进制。第四步添加Authorization头:“SDK-HMAC-SHA256 Access=AppKey, SignedHeaders=host;x-sdk-date, Signature=signature”。所有语言的SDK实现都是这个四步流程的不同代码表达。
Java SDK——Maven工程与HttpClient/OkHttp双实现
Java SDK以“ApiGateway-java-sdk.zip”提供,解压后包含libs/java-sdk-core-x.x.x.jar(签名核心库)、pom.xml(Maven依赖)、src目录下的示例代码。支持HttpClientDemo和OkHttpDemo两种HTTP客户端实现,以及WebSocketDemo和大文件上传Demo。核心调用方式:创建Request对象,调用setKey和setSecret设置环境变量中的AK/SK,setMethod和setUrl设置请求信息,addHeader添加头域,setBody设置请求体,最后调用Client.sign()生成签名请求。支持配置SSL证书验证(SSLClientSuiteUtil.createHttpClientWithVerify)或不验证证书(createHttpClient),以适应不同环境。
pom.xml需配置maven-compiler-plugin(JDK 1.8)和华为云SDK仓库源(https://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk)。依赖包括commons-codec(1.15)、httpclient(4.5.13)、okhttp(4.9.1)、slf4j等。java-sdk-core以systemPath方式引入,需替换为实际路径。
Go/Python/C SDK的简洁实现
Go SDK解压后包含core/escape.go、core/signer.go和demo.go。核心结构体为core.Signer,包含Key和Secret字段。调用方式:s := core.Signer{Key: os.Getenv("HUAWEICLOUD_SDK_AK"), Secret: os.Getenv("HUAWEICLOUD_SDK_SK")},创建http.Request后调用s.Sign(r),然后通过http.DefaultClient.Do发送请求。
Python SDK解压后包含apig_sdk/__init__.py、apig_sdk/signer.py和main.py。核心类为signer.Signer,调用方式:sig = signer.Signer(); sig.Key = os.getenv('HUAWEICLOUD_SDK_AK'); sig.Secret = os.getenv('HUAWEICLOUD_SDK_SK'),创建HttpRequest对象后调用sig.Sign(r),使用requests库发送。
C SDK包含三个项目:apigateway-signature(.Net Standard签名共享库)、sdk-request(调用示例)、backend-signature(后端签名示例)。核心类为Signer,调用方式:Signer signer = new Signer(); signer.Key = Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_AK"); signer.Secret = ...,创建HttpRequest后调用signer.Sign(r)返回HttpWebRequest。
JavaScript/PHP/C++/C/Android多环境支持
JavaScript SDK支持Node.js和浏览器双环境。Node.js使用signer.js模块,var sig = new signer.Signer(),设置Key和Secret后调用sig.Sign(r)生成opts,使用http/https.request发送。浏览器需先配置跨域共享策略,引入hmac-sha256.js和moment.js,通过$.ajax发送XMLHttpRequest。
PHP SDK通过signer.php引入,使用Signer类和Request类,$req = new Request('GET', "https://..."),设置headers和body后调用$signer->Sign($req)生成curl上下文,curl_exec执行请求。
C++和C SDK需安装openssl和curl库(apt-get install libssl-dev libcurl4-openssl-dev)。C++使用RequestParams类,C使用sig_params_t结构体,运行make编译生成可执行文件main。Android SDK在Android Studio中打开工程,app/libs目录下引入java-sdk-core-x.x.x.jar,使用okhttp3.Request和OkHttpClient发送请求,调用Client.signOkhttp()生成签名请求。
SDK开发的最佳实践与常见问题
AK/SK安全:禁止硬编码在代码中,应通过环境变量(HUAWEICLOUD_SDK_AK/HUAWEICLOUD_SDK_SK)或配置文件密文存储。时间同步:客户端须与NTP服务器保持同步,API网关校验X-Sdk-Date与收到请求的时间差,超过15分钟拒绝请求。Body大小限制:APP签名仅支持Body体12M及以下的请求签名,超过需分段上传。环境变量配置(Linux):vi ~/.bashrc → export HUAWEICLOUD_SDK_AK="AK值" → source ~/.bashrc。跨域请求:浏览器JavaScript需在API网关创建跨域共享策略并绑定API。Authorization头格式严格遵循“SDK-HMAC-SHA256 Access=Key, SignedHeaders=host;x-sdk-date, Signature=signature”。若签名失败返回401,检查AK/SK是否正确、时间戳是否同步、请求头是否完整。