Не могу загрузить изображение с помощью aws4 в реагирующем родном, пока работает тот же запрос в python

Моя задача - загрузить картинку в API через react native. Аутентификация выполняется AWS, но без распознавания. Итак, я запрашиваю роль через aws.sts.requestRoleWithSAML, ведьма пока работает. Теперь я подписываю свой запрос с помощью ключа AWS Signature Version 4 Key, используя модуль aws4-react-native, а затем отправляю запрос fetch-post в 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": "[email protected]",
   "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': '[email protected]',
       '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.info(t))});

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
143
1

Ответы 1

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

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