2017-12-12 3 views
0

Mein Code lädt erfolgreich Dokumente in den richtigen Bucket. Ich kann mich anmelden und die Dokumente in den Buckets auf AWS S3 sehen. Wenn ich versuche, die generate_signed_url-Methode in boto3 zu verwenden, um eine URL für diese Dokumente zu erhalten, die dann an Benutzer zum Zugriff auf das Dokument gesendet werden kann, erhalte ich ein SignatureDoesNotMatch mit der Nachricht "Die von uns berechnete Anforderungssignatur stimmt nicht mit der Signatur überein Sie haben Ihren Schlüssel und die Signaturmethode überprüft. "boto3 signierte URL, die zu SignatureDoesNotMatch führt

Wenn ich das Objekt speichern (Nachweis erbracht, dass es richtig, indem Sie sich in AWS arbeitet und die Dateien manuell herunterzuladen), verwende ich:

s3 = boto3.client('s3', region_name='us-east-2', aws_access_key_id='XXXX', aws_secret_access_key='XXXX', config=Config(signature_version='s3v4')) 

    s3.put_object(Bucket=self.bucket_name,Key=path, Body=temp_file.getvalue(),ACL='public-read') 

Dann, wenn ich versuche, die URL zu bekommen, ich bin Verwendung:

s3 = boto3.client('s3', region_name='us-east-2', aws_access_key_id='XXXX', aws_secret_access_key='XXXX', config=Config(signature_version='s3v4')) 

    url = s3.generate_presigned_url(
     'put_object', Params={ 
     'Bucket':self.pdffile_storage_bucket_name, 
     'Key':self.pdffile_url 
     }, 
     ExpiresIn=604799, 
    ) 

ich ziemlich viel von Benutzern über das Internet sah reden sicherstellen, dass Ihr AWS Zugriffsschlüssel darf keine Sonderzeichen enthalten ist. Ich habe das gemacht, und ich bekomme immer noch das gleiche Problem.

+0

Sehen Sie sich die Anforderungsheader an, wenn Sie Ihre vor-signierte URL verwenden. In meinem Fall wurde 'Content-Type' mitgeschickt und ich musste es zur URL-Generierung hinzufügen, da AWS es überprüft. –

+0

@ThijsvanDien können Sie beraten, wie ich diese Anforderungsheader betrachten kann? Das habe ich vorher nicht gemacht. Danke für Ihre Hilfe hier. – RailsTweeter

+0

Sie erstellen einen Link zum Ausführen eines 'PUT', d. H., Benutzer können ein Dokument auf einen vordefinierten Schlüssel im Bucket hochladen. Was am einfachsten ist, hängt davon ab, wo sie das tun werden. In der Tat, ist es das, was du überhaupt willst? Sie haben angegeben, dass Sie Zugriff auf das Dokument gewähren möchten. Versuchen Sie, ("GET") mit einem Link herunterzuladen, der für Uploads gedacht war? Das wird nicht funktionieren. In diesem Fall sollten Sie den Link mit "get_object" anstatt "put_object" erstellen. Beachten Sie auch, dass der "Schlüssel" genau das sein sollte; keine URL, sondern was du beim Hochladen übergeben hast ("Pfad"). –

Antwort

0

Sie generieren eine vorzeichenbehaftete URL für einen Upload, keinen Download. Sie wollen nicht put_object hier ... es ist get_object.

Auch, wie @ThijsvanDien wies darauf hin, ACL='public-read' möglicherweise nicht das, was Sie wollen, beim Hochladen - das macht das Objekt für jeden mit einer nicht signierten URL zugänglich.

+0

Wenn ich mit öffentlichem Lesezugriff einverstanden bin, warum wird meine URL dann immer noch als Zugriff verweigert angezeigt? Ich habe hart in einem URL-Format mit dem Schlüssel codiert, und ich bekomme Zugang verweigert, obwohl ich eine öffentliche ACL las, als ich das Objekt legte. – RailsTweeter

+0

Nur ein direkter "Zugriff verweigert" Fehler ohne Erklärung? Untersuche das Objekt mit der Konsole. Stellen Sie sicher, dass der Pfad Ihren Erwartungen entspricht und überprüfen Sie die Berechtigungen. –

Verwandte Themen