Ich bin neu im Schreiben von Rails und APIs. Ich benötige Hilfe bei der S3-Speicherlösung. Hier ist mein Problem.
Ich schreibe eine API für eine iOS-App, bei der sich die Benutzer mit der Facebook-API unter iOS anmelden. Der Server überprüft den Benutzer anhand der von Facebook an den iOS-Benutzer ausgegebenen Token und stellt ein temporäres Sitzungstoken aus. Ab diesem Zeitpunkt muss der Benutzer Inhalte herunterladen, die in S3 gespeichert sind. Dieser Inhalt gehört nur dem Benutzer und einer Teilmenge seiner Freunde. Dieser Benutzer kann S3 weitere Inhalte hinzufügen, auf die dieselbe Gruppe von Personen zugreifen kann. Ich denke, es ist ähnlich wie das Anhängen einer Datei an eine Facebook-Gruppe ...
Es gibt zwei Möglichkeiten, wie ein Benutzer mit S3 interagieren kann: Überlassen Sie es dem Server oder veranlassen Sie den Server, ein temporäres S3-Token auszustellen (nicht sicher, welche Möglichkeiten hier bestehen), und der Benutzer kann die Inhalts-URLs direkt an S3 abrufen. Ich fand diese Frage über die Ansätze, aber sie ist wirklich veraltet (vor 2 Jahren): Architektur- und Designfrage zum Hochladen von Fotos von der iPhone App und S3
Also die Fragen:
- Gibt es eine Möglichkeit, einen Benutzer auf den Zugriff auf nur einige Inhalte in S3 zu beschränken, wenn ein temporäres Token ausgegeben wird? Wie kann ich das machen? Angenommen, es gibt ... sagen wir 100.000 oder mehr Benutzer.
- Ist es eine gute Idee, das iOS-Gerät diesen Inhalt direkt abrufen zu lassen?
- Oder sollte der Server alle Inhalte steuern lassen (dies löst natürlich die Sicherheit)? Bedeutet dies, dass ich alle Inhalte auf den Server herunterladen muss, bevor ich sie an die verbundenen Benutzer weitergebe?
- Wenn Sie Schienen kennen ... kann ich Büroklammern und aws-sdk-Edelsteine verwenden, um dieses Setup zu erreichen?
Ich entschuldige mich für mehrere Fragen und freue mich über jeden Einblick in das Problem. Vielen Dank :)
Antworten:
Mit dem Juwel aws-sdk können Sie eine temporär signierte URL für jedes S3-Objekt erhalten, indem Sie Folgendes aufrufen
url_for
:Dadurch erhalten Sie eine signierte, temporäre Verwendungs-URL nur für dieses Objekt in S3. Es läuft nach 20 Minuten ab (in diesem Beispiel) und ist nur für dieses eine Objekt geeignet.
Wenn Sie viele Objekte haben, die der Client benötigt, müssen Sie viele signierte URLs ausgeben.
Beachten Sie, dass dies nicht bedeutet, dass der Server jedes Objekt herunterladen muss, sondern nur bestimmte Clients authentifizieren und autorisieren muss, um auf bestimmte Objekte in S3 zuzugreifen.
API-Dokumente von Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
quelle
ACCESS_KEY_ID
(ich erinnere mich nicht auf Anhieb), aber das soll kein Geheimnis sein.AWS_ACCESS_KEY_ID
. Ich dachte ursprünglich, dassAWS_SECRET_ACCESS_KEY
das auch angezeigt wurde, aber es ist nicht.Die obigen Antworten verwenden das alte Juwel aws-sdk-v1 anstelle der neuen Version 2 aws-sdk-resources.
Der neue Weg ist:
Dabei ist your_object_key der Pfad zu Ihrer Datei. Wenn Sie das nachschlagen müssen, würden Sie etwas verwenden wie:
Diese Informationen waren erstaunlich schwer zu finden, und ich gab fast einfach auf und benutzte den älteren Edelstein.
Referenz
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method
quelle
expires_in
erwartet die Daten in Form von Sekunden, stellen Sie einfach sicher, dass Sie diese zuerst konvertieren.