2016-06-14 6 views
6

Railsアプリで画像をアップロードするペーパークリップバックエンドの管理者だけに見せたいgem。その結果、私はそれらを私的に設定しました。AWS S3にアップロードされたプライベート画像の表示 - シークレットアクセスキーからの署名の作成

次に、特定のリンクを持つ管理者だけがファイルを閲覧できる方法を調べました。これは私がfoundです。

私はこれを試してみましたが、必要な署名を作成するのに苦労しています。式は、上記のリンクに与えられているされています

Signature = URL-Encode(Base64(HMAC-SHA1(YourSecretAccessKeyID, UTF-8-Encoding-Of(StringToSign)))); 

StringToSign = HTTP-VERB + "\n" + 
    Content-MD5 + "\n" + 
    Content-Type + "\n" + 
    Expires + "\n" + 
    CanonicalizedAmzHeaders + 
    CanonicalizedResource; 

私は、これはRuby on Railsに上で動作するように取得する必要があり、ライブラリ/モジュール/宝石全く分かりませんでした。私は周りを検索することによってaws-s3 gemについて発見した。私は彼らのwikiを読んで、この「ブラウザからプライベートオブジェクトにアクセスする」を見ました。

私はそれらの宝石をインストールし、私のレールコンソールを開き、それらをテストしようとしました。 AWS S3と接続できましたが、「初期化されていない定数」や「NameError」などのエラーが発生したため、何もできません。

正しい方向へのヒント/ガイダンスがありがとうございます。

最後に、私がしようとしているのは、管理者がブラウザで画像を表示し、ダウンロードしないために使用できるリンクを生成することです。私がこれを読んだことは、それが何をするかである。しかし、それは確かですか、それとも管理者のコンピュータにダウンロードするだけですか?

答えて

5

のようなあなたのattachemnetモデルを変更する、あなただけのexpiring_url featureを使用することができます。したがって、#showまたは#downloadコントローラーアクションを使用して、一時URLにリダイレクトすることができます。あなた自身でそれを実装する必要はありません。

上記のドキュメントでは有効期限が10分であることを推奨していますが、サーバーのクロックが一方向に歪み、S3が別の方法で歪んだ場合、URLはexpire before it existsになります。だから、おそらく20分または30分が安全です。

コントローラのようなアクションを追加する場合は、管理者だけが使用できるようにする必要があります。

+0

これは最も簡単な解決策です。必要なのは「aws-sdk」宝石とペーパークリップだけです。 s3を使用するようにペーパークリップオプションを設定し、s3_permissionsを非公開に設定します。「has_attached_file:document、 :s3_permissions =>:private、 :storage => 's3'」 – zarazan

4

まず、ブラウザで画像を表示できるか、画像をダウンロードできるかの違いはありません。どちらの方法でも、ユーザーのブラウザはイメージを構成するバイトを取得し、必要なものは何でもできる。

Amazonでは、aws-sdk gemを、s3などのサービスにアクセスする正式にサポートされている方法として提供しています。 S3 presigned URLを生成するには、あなたがする必要がなければ、これは。あなたは、インスタンスに提供された資格情報を持っているか、環境変数AWS_ACCESS_KEY_IDとあなたの資格情報を使用してAWS_SECRET_ACCESS_KEYを持っていると仮定し、1時間の有効なリンクを返し

s3 = Aws::S3::Resource.new(region: "us-east-1") 
s3.bucket("bucket-name").object("key/for/object").presigned_url("get", expires_in: 3600) 

のようなものを(するだろうリソースオブジェクトの作成時に指定してください。)

+0

フレデリック、入力いただきありがとうございます。あなたはこれを持っている場所はありますか?私は、キーが置かれている場所、リンクが置かれている場所、そしてこれを自分のニーズにどうやって提供できるのか、さらに詳しく知りたい。たとえば、ファイルのパスと名前の "key/for/object"はありますか?どこに鍵を渡すのですか? –

+1

s3には本当にパスがありません - オブジェクトはキーを持っていますが、パスとして表示されることがよくあります。おそらく宝石のドキュメントhttp://docs.aws.amazon.com/sdkforruby/api/です。 aws ruby​​のブログにもたくさんの例があります。 –

1

ダウンロード可能を定義しますか?メソッドを使用して、トラックへのユーザーアクセス権を実装することができます。簡単にするため、ログインしているすべてのユーザーがトラックにアクセスできるようにしていますが、これをアプリケーションに必要なロジックで置き換えることができます。

def downloadable?(user) 
    user != :guest 
end 

、あなたはペーパークリップを使用しているので、この

has_attached_file :mp3, 
        :url => ':s3_domain_url', 
        :path => 'assets/:class/:id/:style.:extension', 
        :storage => :s3, 
        :s3_credentials => File.join(Rails.root, 'config', 's3.yml'), 
        :s3_permissions => 'authenticated-read', 
        :s3_protocol => 'http' 

have a look at this

関連する問題