2016-10-12 6 views
0

Я пытаюсь сделать загрузку с Heroku по номеру S3 с помощью boto3, но я продолжаю получать ошибку <Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>. Я пробовал использовать pre-signed post и pre-signed url, но ошибка сохраняется. Учетные данные, которые я предоставляю Heroku для запроса, - это мой root AWSAccessKeyID и секретный ключ, поэтому у меня не должно быть проблем с разрешениями. Я могу напрямую загрузить S3 из моей командной строки.boto3 подпись не соответствует с S3

Значения, возвращаемого после создания предварительно подписанного поста:

{'fields': {'x-amz-signature': '26eff5417d0d11a25dd294b059a088e2be37a97f14713962f4240c9f4e33febb', 'x-amz-algorithm': 'AWS4-HMAC-SHA256', 'key': u'sound.m4a', 'x-amz-credential': u'<AWSAccessID>/20161011/us-east-1/s3/aws4_request', 'policy': u'eyJjb25kaXRpb25zIjogW3siYnVja2V0IjogImZ1dHVyZWZpbGVzIn0sIHsia2V5IjogInNvdW5kLm00YSJ9LCB7IngtYW16LWFsZ29yaXRobSI6ICJBV1M0LUhNQUMtU0hBMjU2In0sIHsieC1hbXotY3JlZGVudGlhbCI6ICJBS0lBSTdLRktCTkJTNEM0VktKQS8yMDE2MTAxMS91cy1lYXN0LTEvczMvYXdzNF9yZXF1ZXN0In0sIHsieC1hbXotZGF0ZSI6ICIyMDE2MTAxMVQyMDM4NDlaIn1dLCAiZXhwaXJhdGlvbiI6ICIyMDE2LTEwLTExVDIxOjM4OjQ5WiJ9', 'x-amz-date': '20161011T203849Z'}, 'url': u'https://s3.amazonaws.com/bucketname'} 

код в настоящее время на Heroku:

@api.route('/post_track', methods=['POST']) 
@login_required 
def post_track(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     track = Track.upload_fromJSON(request.form.get('share'), request.form.get('title')) 

     //Postgres entry 
     conn = get_conn() 
     with conn.cursor() as cur: 
      cur.execute('INSERT INTO tracks(user_id, title, share)' 
        'VALUES (%s, %s, %s) RETURNING id;', 
        (track.user_id, track.title, track.share)) 
      track_id = cur.fetchone()[0] 
      conn.commit() 

      //Obtain pre-signed request 
      signed_request = get_signed_request(track.title, request.form.get('type'), track_id, file) 
      return json.dumps({'response':signed_request}) 


def get_signed_request(title, type, track_id, file): 
    S3_BUCKET = os.environ.get('S3_BUCKET') 
    file_name = title 
    file_type = type 
    region = 'us-east-1' 
    s3 = boto3.client('s3', region_name=region, config=Config(signature_version='s3v4')) 

    presigned_post = s3.generate_presigned_post(
     Bucket = S3_BUCKET, 
     Key = file_name 
    ) 

    files = {'file': file} 

    r_response = requests.post(presigned_post["url"], data=presigned_post["fields"], files=files) 

    print(r_response) 
    print(r_response.text) 

Я в конце концов собираюсь установить код для возврата предварительно подписанного запроса к моему интерфейсу и делать прямую отправку оттуда. Просто делайте это как тестовый прогон.

ответ

0

Мне действительно было тяжело с этим. Я обратился к поддержке S3, и они сказали, что запрос, который они получают, выглядел хорошо, и что, должно быть, что-то не так с тем, как подпись создавалась с Heroku. Я потянулся к Героку, и они не ответили. Решена проблема, заключающаяся в том, что я удалил свой AWS-корневой доступ и создал новую, а затем переконфигурировал герою с новыми идентификаторами доступа. Супер просто, но очень странно, что это было проблемой. Надеюсь, это поможет кому-то решить эту проблему.

+0

Вы получили ключи от csv, загруженные с консоли? Этот файл не имеет пустой строки в конце, что заставляет некоторые инструменты (например, 'cat') отображать'% ', чтобы указать это. Если вы скопировали лишний символ, это не сработает. В стороне, не рекомендуется использовать учетные данные учетной записи root. Лучшей практикой является использование пользователей и ролей даже для одного пользователя. –

+0

@ JordonPhillips захотела запустить его с корнем, чтобы убедиться, что ошибки не связаны с разрешениями. Я смущен - в csv im, смотрящем, есть 'AWSAccessKeyID' на одной строке и' AWSSecretKey' в строке ниже. Вы говорите, что в конце каждого ключа должен быть пустой символ типа '_' – Brosef

Смежные вопросы