Как исправить ошибку 'SignatureDoesNotMatch' на Android - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь загрузить изображение из моего приложения Ionic, используя подписанные URL-адреса S3, самая запутанная часть заключается в том, что тот же код работает на iOS, но не работает на Android.

Мое приложение использует cordova-plugin-advanced-http, cordova-plugin-camera и cordova-plugin-file.

мой-component.ts

openPhotoLibrary() {
    this.loadingProvider.showLoader('Aguarde');
    this.viewCtrl.dismiss();
    this.camera.getPicture(this.photoLibraryOptions).then((fileURI) => {
      this.file.resolveLocalFilesystemUrl(fileURI).then(
        (fileEntry: FileEntry) => {
          console.log('resolveLocalFilesystemUrl');
          console.log(fileEntry);

          fileEntry.file((file) => {
            console.log('file');
            console.log(file);
            let newName = uuid().concat('.jpg');
            console.log('newName');
            console.log(newName);

            this.myProvider.getImageUploadUrl(newName, this.JPEG_CONTENT_TYPE).then(
              (res) => {
                let responseData = JSON.parse(res.data);

                console.log('getImageUploadUrl');
                console.log(responseData);
                console.log('FILE THAT WILL BE SENT -> ', file);

                this.myProvider.uploadImage(responseData.data, file, this.JPEG_CONTENT_TYPE).then(
                  (data) => {
                    console.log('uploadImage');
                    console.log(data);
                    this.loadingProvider.hideLoader();
                  }, (error) => {
                    console.error('uploadImage error: ', error);
                    this.loadingProvider.hideLoader();
                  }
                );
              }, (error) => {
                console.error('getImageUploadUrl error: ', error);
              });
            }, (error) => {
              console.error('fileEntry.file error: ', error);
            }
          );
        }, (error) => {
          console.error('resolveLocalFilesystemUrl error: ', error);
        }
      );
     }, (error) => {
      console.error(error);
     });
  }

мой-provider.ts

getImageUploadUrl(fileName: string, fileType: string) {
    const phoneNumber = this.storage.getPhoneNumber();
    const userToken = this.storage.getToken();
    return this.http.get(
      `${API_ROOT}chatimages/getImageUploadUrl?fileName=${fileName}&fileType=${fileType}`, {}, {
        'Authorization': userToken,
        'phoneNumber': phoneNumber
      }
    );
  }

  uploadImage(url: string, image: IFile, imageType: string) {
    console.log('URL');
    console.log(url);
    let host = url.split('?')[0] + '?' + decodeURIComponent(url.split('?')[1]);
    console.log('HOST');
    console.log(host);
    let headers = { 'Accept': '*/*', 'Content-Type': imageType };
    return this.http.put(host, image, headers);
  }

Я ожидаю, что тот же код работает на Android, но я пытаюсь решить эту ошибку ответа на Android, эта ошибка возникает, когда я вызываю uploadImage от моего провайдера:

<?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>{MY_ACCESSKEYID}</AWSAccessKeyId><StringToSign>PUT

application/x-www-form-urlencoded; charset=UTF-8
1562518033
x-amz-acl:private
/gd-chat-images/1d515a36-163a-4bd0-aaf5-7788066f0e49.jpg</StringToSign><SignatureProvided>1VqI E8JXOHx4RFp/JOLOgw9/Fw=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63 6f 64 65 64 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 0a 31 35 36 32 35 31 38 30 33 33 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 72 69 76 61 74 65 0a 2f 67 64 2d 63 68 61 74 2d 69 6d 61 67 65 73 2f 31 64 35 31 35 61 33 36 2d 31 36 33 61 2d 34 62 64 30 2d 61 61 66 35 2d 37 37 38 38 30 36 36 66 30 65 34 39 2e 6a 70 67</StringToSignBytes><RequestId>8F636E127D004199</RequestId><HostId>akhR/eD2/30T7Xw2nkdWLEwn4kgWX7hOui2NMoJ5hNyh0dmKpxbDAlXIotnZbcpFrrdtmvFM/BM=</HostId></Error>
...