не могу загрузить изображение с aws4 в реагировать родной, пока работает тот же запрос в Python - PullRequest
0 голосов
/ 18 мая 2018

Моя задача состоит в том, чтобы загрузить картинку в API через реагировать на нативную.Аутентификация выполняется AWS, но без использования Cognito.Поэтому я запрашиваю роль через aws.sts.requestRoleWithSAML, которая работает до сих пор.Теперь я подписываю свой запрос с помощью ключа AWS Signature Version 4 Key, используя модуль «aws4-реагировать-нативный», а затем отправляю запрос на извлечение сообщений в API.Но я просто не могу заставить его работать.Я получаю сообщение об ошибке:

"Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой секретный ключ доступа AWS и метод подписи. Подробности см. В документации по обслуживанию."

Так что, возможно, я здесь что-то не так делаю, но что я действительно не понимаю, так это тот факт, что я получил полностью рабочий пример Python.

Может быть, кто-то может помочь мне с этой проблемой или просто может предоставить мне информацию о том, как преобразовать часть Python в javascript для RN.

Python-код:

client = boto3.client('sts')
temp_credentials = client.assume_role_with_saml(
            RoleArn='xxxxxx',
            PrincipalArn=''xxxxx',
            SAMLAssertion=saml_response)

auth = AWSRequestsAuth(
   aws_access_key=temp_credentials['Credentials']['AccessKeyId'],
   aws_secret_access_key=temp_credentials['Credentials']
                                      ['SecretAccessKey'],
   aws_host='xxxxx',
   aws_region='us-east-1',
   aws_service='execute-api',
   aws_token=temp_credentials['Credentials']['SessionToken'])

   URL = 'xxxxx'
   files = {'picture': open('IMG_20180326_193921.jpg', 'rb')}
header = {
   "version_code": "1",
   "crop": "MAIZE",
   "device_locale": "US",
   "date": "20180427_173034",
   "peat_id": "200001",
   "user_id": "fakeid25-e6a2-4e0c-9514-ccf429973af5",
   "pla_id": "fakeid05-19ab-4896-b748-e1c1ab99b1a9",
   "pic_id": "fakeidee-752f-42f0-a4e7-3e3e6fed9d76",
   "images_captured": "1",
   "images_uploaded": "0",
   "latitude": "10.15",
   "longitude": "10.15",
   "accuracy": "364",
   "file_name": "my-photo.tif",
   "app_locale": "US",
   "email": "some.person@pioneer.com",
   "user_name": "username",
   "confidence": "HIGH",
   "severity": "HIGH",
   "identifier": "Fake Image",
   "notes": "Blah blah blah"
}
response = requests.post(URL, files=files, headers=header, auth=auth)

Реактивный код:

const data = new FomrData();
data.append('picture', { uri: 'path/to/test.jpg', name: 'test.jpg', 
                        type: 'image/jpg' });
let temp = data.Credentials
let keyID = temp.AccessKeyId
let secretKey = temp.SecretAccessKey
let st = temp.SessionToken

var opts = {
    host: 'xxxxx',
    path: '/image_analysis',
    region: 'us-east-1',
    service: 'execute-api',
    headers: {
       'Host': 'xxxxx',
       'version_code': '1',
       'crop': 'MAIZE',
       'device_locale': 'US',
       'date': '20180427_173034',
       'peat_id': '200001',
       'user_id': 'fakeid25-e6a2-4e0c-9514-ccf429973af5',
       'pla_id': 'fakeid05-19ab-4896-b748-e1c1ab99b1a9',
       'pic_id': 'fakeidee-752f-42f0-a4e7-3e3e6fed9d76',
       'images_captured': '1',
       'images_uploaded': '0',
       'latitude': '10.15',
       'longitude': '10.15',
       'accuracy': '364',
       'file_name': imgname,
       'app_locale': 'US',
       'email': 'some.person@pioneer.com',
       'user_name': 'username',
       'confidence': 'HIGH',
       'severity': 'HIGH',
       'identifier': 'Fake Image',
       'notes': 'Blah blah blah',
       'X-Amz-Date': '20180518T133558Z',
    },
    method: 'POST',
    body: data
}
fetch('https://xxxx', aws4.sign(opts, { secretAccessKey: secretKey, 
                             accessKeyId: keyID, sessionToken: st }))
.then(response => {res.text().then(t => console.log(t))});

Это просто показывает выборку, вызов учетных данных работает нормально.

Надеюсь, кто-нибудь может помочь мне здесь!

1 Ответ

0 голосов
/ 17 сентября 2018

Итак, я понял, в чем проблема.Прежде всего, это совсем не так.Причиной этого является мост между javascript и native swift.Этот мост не позволяет передавать двоичные файлы.В других случаях есть что-то вроде загрузки файлов на сервер Amazon S3, которые должны работать со своими функциями, но в этом случае нам нужно было изменить способ.Нашим решением сейчас является переход с двоичного на base64.Мы должны были что-то изменить на сервере, чтобы я мог загружать строки base64 через приложение.Спасибо всем, кто пытается помочь мне здесь!

...