Как создать предопределенный URL для API шлюза aws - PullRequest
0 голосов
/ 03 января 2019

Я видел предварительно подписанный URL для объекта S3.Можно ли создать предварительно подписанный URL для шлюза API.Я прошел документацию .Я использую .NET.Я хотел бы знать, есть ли библиотека .NET, доступная для создания предварительно подписанного запроса для API шлюза.

ВЫПУСК
У меня есть GET API что-то вроде этого https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/pets?type=dog&page=1и наш клиент будет вызывать этот API время от времени.Устаревший инструмент, который они используют, поддерживает только GET.Поэтому я хотел создать предварительно подписанный URL-адрес (с коротким сроком действия) и предоставить их, когда они попросят об этом.Для каждого клиента у меня уже есть IAM пользователь с соответствующими accesskey и secretkey

1 Ответ

0 голосов
/ 05 января 2019

Предварительно подписанные 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

Примечание -

  1. Кроме того, этот пример жестко закодирован API Path /dev/myApigNodeJS и подписывает его, и он будет отличаться для вас с полным абсолютным путем.
  2. AWS рекомендует подписать все queryStrings,Заголовки, которые вы планируете отправить в запросе.Пройдите .NET-код библиотеки, которую я упоминал, и поймите, как это происходит.

Дайте мне знать, если у вас есть вопросы.

...