Загрузите файл 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 особенно важны для прочтения и понимания.

Другие вопросы по тегам