API-интерфейс Amazon Polly

Я пытаюсь использовать Amazon Polly REST API.
Может ли кто-нибудь помочь мне сделать это?
Я использую Java и OkHttp3 и пробовал следующее:

    String url = "https://polly.us-west-2.amazonaws.com/v1/speech";
    String postBody = "{\"OutputFormat\":\"mp3\",\"Text\":\"Some text to listen\",\"TextType\":\"text\",\"VoiceId\":\"Joanna\"}";

    MediaType mediaType = MediaType.parse("application/json; charset=utf-8");

    OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();



    Request request = new Request.Builder()
            .url(url)
            .addHeader("Authorization", "AWS <accessKey>:<secretKey>")
            .post(RequestBody.create(mediaType, postBody))
            .build();

    Response response = client.newCall(request).execute();

И получил ответ "403 запрещено". Затем я попытался выполнить этот POST-запрос онлайн в этом сервисе и получил следующее: введите здесь описание изображения Что я делаю не так? Что мне исправить? Спасибо!

Документы Amazon: ссылка
И, пожалуйста, не предлагайте мне использовать SDK!


Я прочитал это, это, это, это и это, и все равно ничего не понимает.

  1. Я понимаю, что мой secretKey является секретным и что мне нужно использовать шифрование.
  2. Мне нужно сделать запрос, как описано здесь, но не могу понять как сделать свой запрос... Мои параметры: method=POST, host=polly.us-west-2.amazonaws.com, endpoint=https://polly.us-west-2.amazonaws.com/v1/speech, region=us-west-2, content-type=application/json, body of post request={...}, accessKey=..., secretKey=... ..... А как сделать этот запрос через OkHttp? Пожалуйста помоги!

person Peter Samokhin    schedule 26.06.2017    source источник
comment
Итак, почему именно вы не хотите использовать SDK?   -  person John Rotenstein    schedule 27.06.2017


Ответы (1)


addHeader("Authorization", "AWS <accessKey>:<secretKey>") никогда не выполняется на AWS. Ваш секретный ключ secret.

Запросы аутентифицируются путем их подписи с использованием серии итераций HMAC-SHA на основе вашего секретного ключа.

Есть веские причины не использовать пакеты SDK, но вам необходимо прочитать и понять документацию по созданию подписей.

Когда вы используете интерфейс командной строки AWS (AWS CLI) или один из AWS SDK для отправки запросов к AWS, эти инструменты автоматически подписывают запросы с помощью ключа доступа, который вы указываете при настройке инструментов. Когда вы используете эти инструменты, вам не нужно учиться подписывать запросы самостоятельно. Однако, когда вы вручную создаете HTTP-запросы к AWS, вы должны сами подписывать запросы.

http://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

Процесс подписания подробно объясняется, начиная со ссылки выше.

Подпись версии 4 поддерживается всеми службами во всех регионах.

person Michael - sqlbot    schedule 27.06.2017
comment
Прочтите все инструкции. Процесс на самом деле не сложный, но нужно усвоить много информации, поэтому многие люди рекомендуют SDK. Среди документации вы найдете ссылки на Signature V4 Test Suite, который показывает промежуточные результаты, полученные в процессе подписания. Вы получите действительный заголовок Authorization, который вы добавите к запросу, но он не содержит вашего секретного ключа. - person Michael - sqlbot; 27.06.2017
comment
aws4_request — это статическая строка, она никогда не меняется. Замените iam на polly и установите соответствующий регион. Последняя строка строки для подписи это sha256 канонического запроса. Это все задокументировано. - person Michael - sqlbot; 27.06.2017