在C#中使用Sinch REST API实现短信验证:授权编码问题求助
在C#中实现Sinch短信验证的签名生成方案
我帮你梳理下在C#里实现Sinch的APPLICATION SIGNED REQUEST授权时,生成Content-MD5和stringToSign的正确方式——之前我也踩过类似的坑,直接上实用的代码和关键注意点:
一、正确生成Content-MD5
Sinch要求的Content-MD5是请求体的MD5哈希值经过Base64编码后的字符串,你之前的代码只完成了哈希计算,还差一步转Base64。修正后的代码如下:
using Newtonsoft.Json; using System.Security.Cryptography; using System.Text; // 1. 序列化请求体 var body = JsonConvert.SerializeObject(smsRequest); // 2. 计算MD5哈希 using var md5 = MD5.Create(); var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(body)); // 3. 转成Base64字符串(这步是关键!) var contentMd5 = Convert.ToBase64String(hashBytes);
二、生成stringToSign
Sinch的stringToSign有严格的格式要求,必须按以下顺序拼接(每个部分用换行符\n分隔):
- HTTP请求方法(比如
POST) - Content-MD5值(上面生成的)
- Content-Type(如果是JSON请求就是
application/json) - RFC 1123格式的当前UTC时间(比如
Tue, 15 Nov 1994 08:12:31 GMT) - 请求的路径(注意:只包含域名后的部分,比如调用批量短信API就是
/xms/v1/{你的服务计划ID}/batches)
对应的C#实现代码:
// 1. 获取符合要求的时间字符串 var dateString = DateTime.UtcNow.ToString("r", System.Globalization.CultureInfo.InvariantCulture); // 2. 定义请求方法和路径(替换成你的实际信息) var httpMethod = "POST"; var requestPath = "/xms/v1/your-service-plan-id/batches"; var contentType = "application/json"; // 3. 拼接stringToSign var stringToSign = string.Join("\n", httpMethod, contentMd5, contentType, dateString, requestPath);
三、生成最终的Authorization头
拿到stringToSign后,需要用你的Sinch API Secret作为密钥,通过HMAC-SHA256算法计算签名,再转Base64,最后组装成Authorization头:
// 替换成你的Sinch API密钥信息 var apiKey = "your-sinch-api-key"; var apiSecret = "your-sinch-api-secret"; using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret)); var signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)); var signatureBase64 = Convert.ToBase64String(signatureBytes); // 组装Authorization头 var authorizationHeader = $"Application {apiKey}:{signatureBase64}";
关键注意事项
- 时间必须是UTC时间,且严格遵循RFC 1123格式,Sinch服务器会校验时间偏差,偏差过大直接拒绝请求
- 请求路径必须和实际调用的API路径完全一致,不能包含域名、多余空格
- 拼接
stringToSign时,每个部分的顺序不能错,也不能遗漏换行符
内容的提问来源于stack exchange,提问作者ashish1238
相关产品推荐
相关产品推荐

