發送 HTTP 請求(C# )
本文介紹 API 訂閱方應用如何使用 C# 語言對 HTTP 請求加簽、驗簽。 API 網關提供了 C# SDK,即 mosng-sdk-csharp.zip。該 SDK 集成了加簽、驗簽的邏輯,同時默認支持序列化和反序列化。
前提條件
在進行本地應用開發前,您需要確保已經完成以下操作:
已在 API 網關控制臺創建了一個應用,參見 創建應用。
已將該應用的 APPID 提供給了 API 發布者,并獲得了授權,參見 授權 API。
已獲取了如下服務配置信息。具體獲取方法,參見 獲取服務端信息。
應用的訪問密鑰(Access Key/Secret Key)
API 的域名地址(host)、請求路徑(path)、方法(method)、請求體(body)
操作步驟
獲取并安裝 Visual Studio,可至 Visual Studio 官方網站下載。
引入 C# SDK。
下載 SDK 及二進制文件。
請訪問 mosng-sdk-csharp.zip 和 HttpSignatures.dll.zip 下載 SDK 和 SDK 的二進制文件。 下載“mosng-sdk-csharp.zip”壓縮包并解壓進入對應的目錄后,雙擊 SDK 包“signature.sln”文件,將 C# 的 SDK 引入Visual Studio。其中,HttpSignatures 項目為實現簽名算法的共享庫,可用于 .Net Framework 與 .Net Core 項目。“HttpSignatureTests”項目為調用示例。
解壓 mosng-sdk-csharp.zip 進入對應的目錄后,雙擊 SDK 包
signature.sln
文件,將 C# SDK 引入 Visual Studio。其中,HttpSignatures 項目為實現簽名算法的共享庫,可用于
.Net Framework
與.Net Core
項目。HttpSignatureTests 項目為調用示例。
定義要加簽的 headers 和算法。
var spec =newSignatureSpecification(){ Algorithm="hmac-sha256", Headers=newstring[]{"content-length","host","date","(request-target)"}, KeyId= keyId };
構建 request 對象。 您需要構建 request 對象,用于組裝請求,代碼示例如下:
var request =newRequest(); request.Path="/foo/Bar"; request.Method=HttpMethod.Get; request.SetHeader("content-length","18"); request.SetHeader("host","example.org"); request.SetHeader("date","Tue, 07 Jun 2014 20:51:35 GMT");
構建一個 signer 對象。
AuthorizationParser 對象包含 hmac-sha1、hmac-sha256、hmac-sha512 三種算法。HttpSignatureStringExtractor 對象初始化,用來加簽 request 請求 header 中的字段。
代碼示例如下:
var signer =new HttpSigner(newAuthorizationParser(),newHttpSignatureStringExtractor()); signer.Sign(request, spec, keyId, privateKey);
簽名計算。
計算簽名之后,簽名信息放在 request 的 header[“Signature”] 里。
代碼示例如下:
var signer =new HttpSigner(newAuthorizationParser(),newHttpSignatureStringExtractor()); signer.Sign(request, spec, keyId, privateKey);
簽名驗證。
取出 request 的 header[“Signature”] 里的加簽信息并查詢驗證結果。
代碼示例如下:
string s = signer.CalculateSignature(request, spec, privateKey); Console.WriteLine(s); Assert.AreEqual("yT/NrPI9mKB5R7FTLRyxxxx+QLQOEAvbGmauxxxx+Jg=", s);
完整樣例
如果 API 開啟了密鑰認證,您還需要在工程中配置相應的 Access Key 和 Secret Key,推薦使用啟動參數和環境變量的形式。
# 客戶端請求的ak、sk,就是應用的密鑰信息
gateway.accessKey=<ytestAccessKey ID>
gateway.secretKey=<testAccessKey Secret>
apigateway.authorization=<yourAuthorization>
[Test]
publicvoidSignRequestTest2()
{
@Value("${gateway.accessKey}")
private String accessKey;
@Value("${gateway.secretKey}")
private String secretKey;
@Value("${apigateway.authorization}")
private String authorization;
// 定義要加簽的headers和算法
var spec =newSignatureSpecification()
{
Algorithm="hmac-sha256",
Headers=newstring[]{"content-length","host","date","(request-target)"},
KeyId= keyId
};
// http 請求
var request =newRequest();
request.Path="/foo/Bar";
request.Method=HttpMethod.Get;
request.SetHeader("content-length","18");
request.SetHeader("host","example.org");
request.SetHeader("date","Tue, 07 Jun 2014 20:51:35 GMT");
// 簽名計算,計算之后,簽名信息放在request的 header["Signature"] 里
var signer =new HttpSigner(newAuthorizationParser(),newHttpSignatureStringExtractor());
signer.Sign(request, spec, keyId, privateKey);
Console.WriteLine(request.GetHeader("Signature"));
Assert.AreEqual(authorization, request.GetHeader("Signature"));
// 獨立的簽名計算方法
string s = signer.CalculateSignature(request, spec, privateKey);
Console.WriteLine(s);
Assert.AreEqual("yT/NrPI9mKB5R7FTLRyFWvB+QLQOEAvbGmauC0tI+Jg=", s);
}
加簽算法
Base64(hmac-sha256(signing_string, Encoding.UTF8.GetBytes(private_key)))
Base64(hmac-sha512(signing_string, Encoding.UTF8.GetBytes(private_key)))
Base64(hmac-sha1(signing_string, Encoding.UTF8.GetBytes(private_key)))
signing_string:加簽的字符串,根據 SignatureSpecification 里的 Headers 里定義的頭生成。
secret_key:私鑰,用 UTF-8 編碼轉成字節數組。
限制說明
目前沒有對 HTTP 請求的 body 做摘要(digest)加簽。