Загрузите файл Evaporate.js с токеном безопасности x-amz: SignatureDoesNotMatch
Я хочу загрузить файл с испарителем.js и crypto-js, используя токен x-amz-security-token:
import * as Evaporate from 'evaporate';
import * as crypto from "crypto-js";
Evaporate.create({
aws_key: <ACCESS_KEY>,
bucket: 'my-bucket',
awsRegion: 'eu-west',
computeContentMd5: true,
cryptoMd5Method: data => crypto.algo.MD5.create().update(String.fromCharCode.apply(null, new Uint32Array(data))).finalize().toString(crypto.enc.Base64),
cryptoHexEncodedHash256: (data) => crypto.algo.SHA256.create().update(data as string).finalize().toString(crypto.enc.Hex),
logging: true,
maxConcurrentParts: 5,
customAuthMethod: (signParams: object, signHeaders: object, stringToSign: string, signatureDateTime: string, canonicalRequest: string): Promise<string> => {
const stringToSignDecoded = decodeURIComponent(stringToSign)
const requestScope = stringToSignDecoded.split("\n")[2];
const [date, region, service, signatureType] = requestScope.split("/");
const round1 = crypto.HmacSHA256(`AWS4${signParams['secret_key']}`, date);
const round2 = crypto.HmacSHA256(round1, region);
const round3 = crypto.HmacSHA256(round2, service);
const round4 = crypto.HmacSHA256(round3, signatureType);
const final = crypto.HmacSHA256(round4, stringToSignDecoded);
return Promise.resolve(final.toString(crypto.enc.Hex));
},
signParams: { secretKey: <SECRET_KEY> },
partSize: 1024 * 1024 * 6
}).then((evaporate) => {
evaporate.add({
name: 'my-key',
file: file, // file from <input type="file" />
xAmzHeadersCommon: { 'x-amz-security-token': <SECURITY_TOKEN> },
xAmzHeadersAtInitiate: { 'x-amz-security-token': <SECURITY_TOKEN> },
}).then(() => console.log('complete'));
},
(error) => console.error(error)
);
но он производит этот вывод
AWS Code: SignatureDoesNotMatch, Message:The request signature we calculated does not match the signature you provided. Check your key and signing method.status:403
Что я делаю неправильно
ПРИМЕЧАНИЕ
Это версия, которую я использую на стороне браузера:
{
"crypto-js": "^4.1.1",
"evaporate": "^2.1.4"
}
1 ответ
У вас изменены параметры crypto.HmacSHA256. Все они должны быть наоборот. Я бился головой о стену, пытаясь заставить испариться 2.x работать на прошлой неделе, это было очень неприятно.
Я попробовал ваш код выше и просмотрел все документы и сообщения на форуме, связанные с этим, и я думаю, что использование Cognito для этой аутентификации просто не работает или не очевидно, как это должно работать, хотя документы AWS предполагают, что это возможно.
В конце концов, я решил использовать аутентификацию Lambda и, наконец, заставил ее работать после того, как увидел много дезинформации о том, как использовать различные криптобиблиотеки для подписи этого материала. Я заработал прошлой ночью после тщательного изучения всего происходящего. Чтение документов также помогло мне найти правильный путь в отношении того, как должна работать криптография, в ней приведены примеры входных и выходных данных, чтобы вы могли убедиться, что ваши криптографические методы работают так, как ожидает AWS:
https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
Задания 1, 2 и 3 особенно важны для прочтения и понимания.