InvalidSignatureException с AWS Kinesis Video Stream C# - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь выполнить свой собственный подписанный HTTP-запрос, поскольку в C# для API PutMedia для видеопотока Kinesis AWS отсутствует SDK, но появляется следующее сообщение об ошибке:

StatusCode: 403, ReasonPhrase: 'Forbidden' x-amzn-ErrorType: InvalidSignatureException: http://internal.amazon.com/coral/com.amazon.coral.service/

Вот суть того, что мой код выглядит так:

            var streamName = "audio-stream-test";
            var service = "kinesisvideo";
            var endpoint = GetPutMediaEndpoint(streamName);
            var host = GetHostFromEndpoint(endpoint);
            var region = GetRegionFromEndpoint(endpoint);

            var t = DateTime.UtcNow;
            var canonical_uri = $"{endpoint}/putMedia";

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(canonical_uri));
            httpRequestMessage.Headers.Add("connection", "keep-alive");
            httpRequestMessage.Headers.Add("host", host);
            httpRequestMessage.Headers.Add("Transfer-Encoding", "chunked");
            httpRequestMessage.Headers.Add("user-agent", "AWS-SDK-KVS/2.0.2");
            httpRequestMessage.Headers.Add("x-amzn-fragment-acknowledgment-required", "1");
            httpRequestMessage.Headers.Add("x-amzn-fragment-timecode-type", "ABSOLUTE");
            httpRequestMessage.Headers.Add("x-amzn-producer-start-timestamp", (t - DateTime.MinValue).TotalMilliseconds.ToString());
            httpRequestMessage.Headers.Add("x-amzn-stream-name", streamName);
            httpRequestMessage.Headers.Add("x-amz-security-token", sessionToken);

            var byteArray = File.ReadAllBytes(filePath);
            var content = new ByteArrayContent(byteArray);
            httpRequestMessage.Content = content;

            var httpClient = new HttpClient();

            var aws4RequestSigner = new AWS4RequestSigner(accessKey, secretAccessKey);
            var signedHttpRequestMessage = aws4RequestSigner.Sign(httpRequestMessage, service, region).Result;
            var httpResponseMessage = httpClient.SendAsync(signedHttpRequestMessage);

Снимок экрана с ошибкой

Я использую пакет Aws4RequestSigner NuGet для подписания запроса. Есть идеи, что я здесь делаю не так? Кто-нибудь пытался успешно использовать AWS Kinesis Video Stream с C # /. NET?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Это ответ на ваш вопрос: «фактическое» содержание »не добавляется в поток. Я вижу« Поставить соединение из KVS, но данные не добавлены ».

После получения 200 путем установки заголовков http правильно для подписи с помощью приведенного ниже кода, вам нужно, чтобы ваш контент был установлен в signatureHttpRequestMessage.

var httpResponseMessage = httpClient.SendAsyn c (signatureHttpRequestMessage);

0 голосов
/ 30 января 2020

Две потенциальные проблемы с псевдокодом.

  1. Если используется токен сеанса, то подписывание запроса должно включать токен сеанса, а не только комбинацию ключа доступа / секретного ключа доступа.
  2. Тело PutMedia является "бесконечным", поскольку оно передается как поток в реальном времени. Таким образом, данные не должны быть включены в расчет подписи.
...