有効期限を指定して一時的なダウンロードを許可することができる素敵モジュール。
livedoorさんが公開してます。
http://labs.edge.jp/src/
PHPでダウンロードの制限をかける方法を探しててこのモジュールを発見
使ってみた時のメモ
環境
FreeBSD6.4
Apache/2.2.9
PHP 5.2.6
http://code.google.com/p/modaccesstoken/
ここからダウンロードして解凍
#./configure
#make install
でインストール完了
httpd.confに
LoadModule access_token_module libexec/apache22/mod_access_token.so
があることを確認
あとは制限かけたいディレクトリに設定を書き込む
私の場合は.htaccessに書きました。
virtualhostの設定に書いたりももちろんできます。
.htaccessに書く場合
AccessTokenCheck On
AccessTokenSecret 15cfb576a8bdc1551219fdeb3117ed85
AccessTokenAccessKey 7864ffcb01fb5cde1f1c2f37b619fbcd
confに書く場合
1 2 3 4 5 6 7 |
<VirtualHost xxx.xxx.xxx.xxx> <Location /protected><span style="font-family: sans-serif;"> </span>AccessTokenCheck On AccessTokenSecret 15cfb576a8bdc1551219fdeb3117ed85 AccessTokenAccessKey 7864ffcb01fb5cde1f1c2f37b619fbcd </Location> </VirtualHost> |
注意:このAccessKeyとSecretはexampleに書いてあるまんまなので使うときは書き換えてください
これでディレクトリ内のファイルにアクセスしにいくと403エラーがでるはずです。
次にURLの作成ですが
1 |
<span class="pln">http</span><span class="pun">:</span><span class="com">//example.com/protected/example.jpg?AccessKey=<AccessKey>&Expires=<Expires>&Signature=<Signature></span> |
- AccessKey: httpd.conf 中であらかじめ設定しておいた AccessKey
- Expires: 有効期限 UNIX エポックからの秒数
- Signature: リクエストを認証する HMAC-SHA1 値を Base64 エンコードしたもの
Signature は以下の手順で生成します。
1 2 3 |
<span class="typ">PlainText</span> <span class="pun">=</span> <span class="pun"><</span><span class="pln">METHOD</span><span class="pun">></span> <span class="pun">+</span> <span class="pun"><</span><span class="pln">URI</span><span class="pun">></span> <span class="pun">+</span> <span class="pun"><</span><span class="pln">EXPIRES</span><span class="pun">></span> <span class="pun">+</span> <span class="pun"><</span><span class="pln">ACCESS_KEY</span><span class="pun">></span> <span class="typ">Signature</span> <span class="pun">=</span><span class="pln"> Base64</span><span class="pun">(</span><span class="pln">HMAC_SHA1</span><span class="pun">(</span><span class="typ">PlainText</span><span class="pun">,</span> <span class="typ">Secret</span><span class="pun">)) </span> |
となっているのでこの通りに作ります
私はPHPでやりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<span class="synSpecial"><? $domain = 'http://example.com'; $file = '/test/test.zip'; //絶対パスで $secret = '15cfb576a8bdc1551219fdeb3117ed85'; $accesskey = '7864ffcb01fb5cde1f1c2f37b619fbcd'; $expires = time() + 300; //5分制限 $plaintext = 'GET'.$file.$expires.$accesskey; $signature = base64_encode(hash_hmac('sha1', $plaintext, $secret, true)); $signature = str_replace('=', '', $signature); $url = $domain.$file.'?AccessKey='.$accesskey.'&Expires='.$expires.'&Signature='.$signature; print $url; ?> </span> これでURLが出るのでダウンロードできるはずです。 他にもmod_access_tokenを解凍した中にegディレクトリがあるので その中のsign.plを使ってもURLが出せます。 ./sign.pl <span class="synSpecial">[URL]</span> [accesskey] [secret] [time] アクセスできない場合はapacheのエラーログが出ているので確認 [error] Invalid signature: GET/test/test.zip12363129417864ffcb01fb5cde1f1c2f37b619fbcd => rMt/UI20T4yP0Vi+Ql5ltFNK/BM:1XeN4wx7A74ZNi7BNfEUi+86f3s Invalid signature: <span class="typ">PlainText</span> => <Signature1>:<Signature2> Signature1とSignature2が違うとエラーがでます。 |
コメント