Загрузка файла с почтальоном с предварительно подписанным URL не работает - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь загрузить файл с помощью почтальона. Я прикрепил файл, нажав «тело» (в почтальоне) -> двоичный файл -> выбрать файл. Я использую S3 для загрузки с предварительно подписанными URL-адресами. В URL имя файла точно такое же, как и имя файла, который я выбираю в почтальоне. При выполнении запроса я получаю сообщение об ошибке:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
    <AWSAccessKeyId>...</AWSAccessKeyId>
    <StringToSign>PUT

text/plain
1551977056
x-amz-acl:private
/wiivv-staging-private-storage/measurement/6506684788010901504/1551405460831/topLeft-2.jpeg</StringToSign>
    <SignatureProvided>...</SignatureProvided>
    <StringToSignBytes>...</StringToSignBytes>
    <RequestId>DB2FC5FE064CF49A</RequestId>
    <HostId>zbsLj7mcuXJa8D9JX1jFN1Lo+lI02/EvJreAXmPQjPezmU1sucQamXuqlGoUBzAq3nAaejx3doA=</HostId>
</Error>

Однако, экспортируя запрос почтальона (нажав «код»), чтобы получить команду curl, я получаю:

curl -X PUT \
  '[s3-presigned-url]' \
  -H 'Postman-Token: 84700b0d-0cd2-4de5-b52c-7de39a12253e' \
  -H 'cache-control: no-cache'

И добавление дополнительной опции для загрузки файла:

curl -X PUT \
  '[s3-presigned-url]' \
  -H 'Postman-Token: 84700b0d-0cd2-4de5-b52c-7de39a12253e' \
  -H 'cache-control: no-cache'
  --upload-file ~/topLeft-2.jpeg

это сработало!

В итоге, в почтальоне он не работает и тот же запрос экспортируется в curl с добавлением опции --upload-file, он работает ...

Как заставить запрос работать с почтальоном?

РЕДАКТИРОВАТЬ 1: Похоже, это связано с ошибкой https://github.com/postmanlabs/postman-app-support/issues/2521, когда почтальон автоматически добавляет заголовок Content-Type: text/plain, даже если заголовки не были предоставлены.

РЕДАКТИРОВАТЬ 2: здесь снимок экрана консоли почтальона. Видите нежелательный заголовок content-type? enter image description here Но вы не сможете увидеть этот заголовок, если переключите вывод Pretty: enter image description here

РЕДАКТИРОВАТЬ 3: используя "content-type: multipart / form-data", я получаю

PUT /measurement/6506684788010901504/1551405460831/topLeft-2.jpeg?AWSAccessKeyId=AKIAIKNR3HJGZI24MDTQ&Expires=1554393626&Signature=OaqaUqB2%2B3jp2AH97aWKujV3ZD8%3D&x-amz-acl=private
Content-Type: multipart/form-data; boundary=--------------------------092560820091438222667657
cache-control: no-cache
Postman-Token: e45247b4-0fc4-4adb-8e7b-effb82dc8e73
User-Agent: PostmanRuntime/7.6.1
Accept: */*
Host: wiivv-staging-private-storage.s3.amazonaws.com
accept-encoding: gzip, deflate
content-length: 199703

name=topLeft-2.jpegfilename=[object Object]

HTTP/1.1 403
status: 403
x-amz-request-id: 640967A618ABD4A0
x-amz-id-2: IVZtpEDxEEo0R7JaQWrsOi8/6UESbKH4dZNWDnwJDJBhv1ppZx56cvMPt6xT4ZJ3qWiFernsu54=
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 04 Apr 2019 15:58:34 GMT
Connection: close
Server: AmazonS3
<?xml version="1.0" encoding="UTF-8"?> <Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAIKNR3HJGZI24MDTQ</AWSAccessKeyId><StringToSign>PUT multipart/form-data; boundary=--------------------------092560820091438222667657 1554393626 x-amz-acl:private /wiivv-staging-private-storage/measurement/6506684788010901504/1551405460831/topLeft-2.jpeg</StringToSign><SignatureProvided>OaqaUqB2+3jp2AH97aWKujV3ZD8=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 6d 75 6c 74 69 70 61 72 74 2f 66 6f 72 6d 2d 64 61 74 61 3b 20 62 6f 75 6e 64 61 72 79 3d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 30 39 32 35 36 30 38 32 30 30 39 31 34 33 38 32 32 32 36 36 37 36 35 37 0a 31 35 35 34 33 39 33 36 32 36 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 72 69 76 61 74 65 0a 2f 77 69 69 76 76 2d 73 74 61 67 69 6e 67 2d 70 72 69 76 61 74 65 2d 73 74 6f 72 61 67 65 2f 6d 65 61 73 75 72 65 6d 65 6e 74 2f 36 35 30 36 36 38 34 37 38 38 30 31 30 39 30 31 35 30 34 2f 31 35 35 31 34 30 35 34 36 30 38 33 31 2f 74 6f 70 4c 65 66 74 2d 32 2e 6a 70 65 67</StringToSignBytes><RequestId>640967A618ABD4A0</RequestId><HostId>IVZtpEDxEEo0R7JaQWrsOi8/6UESbKH4dZNWDnwJDJBhv1ppZx56cvMPt6xT4ZJ3qWiFernsu54=</HostId></Error>

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Хорошо, кто бы ни пришел к этой проблеме, вот как я ее исправил. В нашей логике приложения мы теперь предварительно подписали URL-адрес заданным типом содержимого типа application / octet-stream (я не думаю, что это действительно имеет значение, важно перезаписать «text / plain», который автоматически добавляется приложение почтальона), и мы отправляем указанный тип контента вместе с запросом почтальона.

let s3Param = {
  Bucket: this.bucketName,
  Key: filePath,
  Expires: bucketConfig.uploadExpireInSecond,
  ACL: bucketConfig.acl,
  ContentType: 'application/octet-stream',
};

s3.getSignedUrl('putObject', s3Param, ...);

и в заголовках запросов почтальона мы имеем "Conent-Type: application / octet-stream"

0 голосов
/ 19 марта 2019

Либо ваша точка ошибки в Почтальоне верна, либо вы пропустили имя файла на 1-м шаге, поэтому ошибка Несоответствие подписи. Я столкнулся с этим сценарием несоответствия подписи, когда я не передавал имя файла для загрузки и «предполагал», что имя файла на моем компьютере будет использоваться на S3. Это был не тот случай.

EDIT

Тип содержимого должен быть multipart / form-data, а НЕ обычным текстом. Вы можете использовать name = "filename" при загрузке файла, как показано в примере ниже.

PUT  HTTP/1.1
cache-control: no-cache
Postman-Token: 98317a86-3352-48f6-bff0-e25413cb56dd
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

Content-Disposition: form-data; name="status.png"; filename="/Desktop/status.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...