Предварительно подписанные URL-адреса обычно подписываются с помощью процесса подписания AWS SigV4 .
Вы можете создавать подписанные URL-адреса SigV4 для своих API-шлюзов размещенных конечных точек.Как правило, вам нужно отправить подпись SigV4 в заголовке запроса авторизации.Если вы готовы отправлять заголовок, то здесь - это один пример библиотеки, которую вы можете попробовать для .NET, которая создает HTTP-запрос с подписанным заголовком.
Если ваши клиенты не могут отправить заголовок авторизации илиВы не можете использовать вышеуказанную библиотеку, тогда вы можете преобразовать подпись в формат строки запроса и предоставить им предварительно подписанные URL-адреса.
Эта документация AWS содержит пример на Python о том, как генерировать запросСтроковый URL.Теперь вы можете взять пример с Python и преобразовать его в код на основе .NET со следующим примером.
public string GetSig4QueryString(string host, string service, string region)
{
var t = DateTimeOffset.UtcNow;
var amzdate = t.ToString("yyyyMMddTHHmmssZ");
var datestamp = t.ToString("yyyyMMdd");
var canonical_uri = "/dev/myApigNodeJS";
var canonical_headers = "host:" + host+"\n";
var signed_headers = "host";
var credential_scope = $"{datestamp}/{region}/{service}/aws4_request";
var canonical_querystring = "X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=" + WebUtility.UrlEncode(_access_key + "/" + credential_scope)
+ "&X-Amz-Date=" + amzdate + "&X-Amz-SignedHeaders=" + signed_headers;
Console.WriteLine("canonical_querystring");
Console.WriteLine(canonical_querystring);
var payload_hash = Hash(new byte[0]);//No Payload for GET
var canonical_request = new StringBuilder();
canonical_request.Append("GET\n");
canonical_request.Append(canonical_uri + "\n");
canonical_request.Append(canonical_querystring + "\n");
canonical_request.Append(canonical_headers + "\n");
canonical_request.Append(signed_headers + "\n");
canonical_request.Append(payload_hash);
Console.WriteLine("canonical_request");
Console.WriteLine(canonical_request);
var string_to_sign = $"{algorithm}\n{amzdate}\n{credential_scope}\n" + Hash(Encoding.UTF8.GetBytes(canonical_request.ToString()));
Console.WriteLine("string_to_sign");
Console.WriteLine(string_to_sign);
var signing_key = GetSignatureKey(_secret_key, datestamp, region, service);
var signature = ToHexString(HmacSHA256(signing_key, string_to_sign));
var signed_querystring = canonical_querystring+"&X-Amz-Signature=" + signature;
return signed_querystring;
}
GetSig4QueryString("myApiId.execute-api.us-east-1.amazonaws.com","execute-api","us-east-1");
//Returned String --> X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential= AKIAIOSFODNN7EXAMPLE%2F20190104%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20190104T190309Z&X-Amz-SignedHeaders=host&X-Amz-Signature=7b830fce28f7800b3879a25850950f6c4247dfdc07775b6952295fa2fff03f7f
Полная конечная точка становится -
https://myApiId.execute -api.us-east-1.amazonaws.com/dev/myApigNodeJS?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20190104%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20190104T190309Z&X-Amz-SignedHeaders = host & X-Amz-Signature = 7b830fce28f7800b3879a25850950f6c4247dfdc07775b6952295fa2fff03f7f
Примечание -
- Кроме того, этот пример жестко закодирован API Path
/dev/myApigNodeJS
и подписывает его, и он будет отличаться для вас с полным абсолютным путем. - AWS рекомендует подписать все queryStrings,Заголовки, которые вы планируете отправить в запросе.Пройдите .NET-код библиотеки, которую я упоминал, и поймите, как это происходит.
Дайте мне знать, если у вас есть вопросы.