94

RailsとAPIを書くのは初めてです。S3ストレージソリューションについてサポートが必要です。これが私の問題です。

ユーザーがiOSでFacebookAPIを使用してログインするiOSアプリのAPIを作成しています。サーバーは、FacebookがiOSユーザーに発行するトークンに対してユーザーを検証し、一時的なセッショントークンを発行します。この時点から、ユーザーはS3に保存されているコンテンツをダウンロードする必要があります。このコンテンツは、ユーザーとその友人のサブセットにのみ属します。このユーザーは、同じユーザーがアクセスできるコンテンツをS3に追加できます。Facebookのグループにファイルを添付するのと似ていると思います...

ユーザーがS3と対話する方法は2つあります...サーバーに任せるか、サーバーに一時的なS3トークンを発行させ(ここでの可能性はわかりません)、ユーザーはコンテンツURLを直接S3にアクセスできます。この質問はアプローチについて話しているのを見つけましたが、実際には日付が付けられています(2年前):iPhoneアプリとS3からの写真のアップロードに関するアーキテクチャとデザインの質問

だから質問:

  • 一時的なトークンが発行されたときに、ユーザーがS3の一部のコンテンツにのみアクセスするように制限する方法はありますか?これどうやってするの?10万人以上のユーザーがいると仮定します。
  • iOSデバイスにこのコンテンツを直接引き出しさせるのは良い考えですか?
  • または、サーバーにすべてのコンテンツの受け渡しを制御させる必要がありますか(これはもちろんセキュリティを解決します)?これは、接続されているユーザーにコンテンツを渡す前に、すべてのコンテンツをサーバーにダウンロードする必要があることを意味しますか?
  • レールをご存知の場合...ペーパークリップとaws-sdkgemを使用して、このような設定を実現できますか?

複数の質問をお詫びします。問題についての洞察に感謝します。ありがとう :)

4

2 に答える 2

113

aws-sdk gemを使用すると、以下を呼び出して、任意の S3 オブジェクトの一時的な署名付き URL を取得できますurl_for

s3 = AWS::S3.new(
  :access_key_id => 1234,
  :secret_access_key => abcd
)
object = s3.buckets['bucket'].objects['path/to/object']
object.url_for(:get, { :expires => 20.minutes.from_now, :secure => true }).to_s

これにより、S3 内のそのオブジェクトのみの署名済みの一時的な使用 URL が得られます。(この例では) 20 分後に有効期限が切れ、その 1 つのオブジェクトにのみ有効です。

クライアントが必要とするオブジェクトが多数ある場合は、多数の署名付き URL を発行する必要があります。

または、サーバーがすべてのコンテンツの受け渡しを制御できるようにする必要がありますか (これにより、もちろんセキュリティが解決されます)。これは、接続しているユーザーに渡す前に、すべてのコンテンツをサーバーにダウンロードする必要があるということですか?

これは、サーバーが各オブジェクトをダウンロードする必要があるという意味ではなく、S3 の特定のオブジェクトにアクセスするために特定のクライアントを認証および承認する必要があるだけであることに注意してください。

Amazon の API ドキュメント: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth

于 2012-06-05T17:31:29.877 に答える