1. ホーム
  2. ruby-on-rails

[解決済み] rails API / iOSクライアントで、S3にデータを保存し、安全な方法でユーザーアクセスを許可するにはどうすればよいですか?

2023-02-20 19:12:07

質問

私はRailsとAPIを書くのに新しいです。私はS3ストレージソリューションでいくつかの助けを必要とします。以下は私の問題です。

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

サーバーに任せるか、サーバーに一時的なS3トークンを発行してもらい(ここでの可能性はよくわかりません)、ユーザーはコンテンツのURLを直接S3にヒットさせることができるのです。私はこのアプローチについて話しているこの質問を見つけました、しかし、それは本当に古いです(2年前)。 iPhoneアプリとS3から写真をアップロードすることについてのアーキテクチャとデザインの質問

ということで、質問です。

  • 一時的なトークン発行時に、S3上の一部のコンテンツにしかアクセスできないようにユーザーを制限する方法はありますか?どうすればいいでしょうか?ユーザーが...例えば10万人以上いると仮定します。
  • iOS デバイスにこのコンテンツを直接引き出させるのは良いアイデアでしょうか?
  • それとも、サーバーにすべてのコンテンツの受け渡しを制御させるべきでしょうか (もちろん、これはセキュリティを解決します)?これは、接続されているユーザーに渡す前に、すべてのコンテンツをサーバーにダウンロードしなければならないことを意味しますか?
  • もしあなたがrailsを知っているならば...私はこの種の設定を達成するためにpaperclipとaws-sdk gemsを使用することができますか?

複数の質問を謝罪し、私は問題への洞察に感謝します。ありがとうございます :)

どのように解決するのですか?

を使用して 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