From 953a33b4f7a62b7d33cca2374eb4cd82759620e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=9F=E9=A2=B5?= Date: Wed, 11 Dec 2024 07:34:28 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E4=B8=8A=E4=BA=86=E5=8F=82=E6=95=B0x-?= =?UTF-8?q?acs-content-sha256=EF=BC=8C=E8=AF=A6=E8=A7=81=E5=AE=98=E6=96=B9?= =?UTF-8?q?openapi=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3https://help.aliyun.?= =?UTF-8?q?com/zh/sdk/product-overview/v3-request-structure-and-signature?= =?UTF-8?q?=3Fspm=3Da2c4g.11186623.0.0.121d3922Z4zJZc#section-mqj-l8f-ak0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 曟颵 --- .../sms/core/client/impl/AliyunSmsClient.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/AliyunSmsClient.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/AliyunSmsClient.java index 558dbdef2..63090ada1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/AliyunSmsClient.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/AliyunSmsClient.java @@ -136,15 +136,20 @@ public class AliyunSmsClient extends AbstractSmsClient { .map(entry -> percentCode(entry.getKey()) + "=" + percentCode(String.valueOf(entry.getValue()))) .collect(Collectors.joining("&")); - // 2.1 请求 Header + // 2. 请求 Body + String requestBody = ""; // 短信 API 为 RPC 接口,query parameters 在 uri 中拼接,因此 request body 如果没有特殊要求,设置为空。 + String hashedRequestPayload = DigestUtil.sha256Hex(requestBody); + + // 3.1 请求 Header TreeMap headers = new TreeMap<>(); headers.put("host", HOST); headers.put("x-acs-version", VERSION); headers.put("x-acs-action", apiName); headers.put("x-acs-date", FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone("GMT")).format(new Date())); headers.put("x-acs-signature-nonce", IdUtil.randomUUID()); + headers.put("x-acs-content-sha256", hashedRequestPayload); - // 2.2 构建签名 Header + // 3.2 构建签名 Header StringBuilder canonicalHeaders = new StringBuilder(); // 构造请求头,多个规范化消息头,按照消息头名称(小写)的字符代码顺序以升序排列后拼接在一起 StringBuilder signedHeadersBuilder = new StringBuilder(); // 已签名消息头列表,多个请求头名称(小写)按首字母升序排列并以英文分号(;)分隔 headers.entrySet().stream().filter(entry -> entry.getKey().toLowerCase().startsWith("x-acs-") @@ -157,13 +162,13 @@ public class AliyunSmsClient extends AbstractSmsClient { }); String signedHeaders = signedHeadersBuilder.substring(0, signedHeadersBuilder.length() - 1); - // 3. 请求 Body - String requestBody = ""; // 短信 API 为 RPC 接口,query parameters 在 uri 中拼接,因此 request body 如果没有特殊要求,设置为空。 - String hashedRequestBody = DigestUtil.sha256Hex(requestBody); - // 4. 构建 Authorization 签名 - String canonicalRequest = "POST" + "\n" + "/" + "\n" + queryString + "\n" - + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestBody; + String canonicalRequest = "POST" + "\n" + + "/" + "\n" + + queryString + "\n" + + canonicalHeaders + "\n" + + signedHeaders + "\n" + + hashedRequestPayload; String hashedCanonicalRequest = DigestUtil.sha256Hex(canonicalRequest); String stringToSign = "ACS3-HMAC-SHA256" + "\n" + hashedCanonicalRequest; String signature = SecureUtil.hmacSha256(properties.getApiSecret()).digestHex(stringToSign); // 计算签名