有効期限を指定して一時的なダウンロードを許可することができる素敵モジュール。
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に書く場合
<VirtualHost xxx.xxx.xxx.xxx>
<Location /protected>
AccessTokenCheck On
AccessTokenSecret 15cfb576a8bdc1551219fdeb3117ed85
AccessTokenAccessKey 7864ffcb01fb5cde1f1c2f37b619fbcd
</Location>
</VirtualHost>
注意:このAccessKeyとSecretはexampleに書いてあるまんまなので使うときは書き換えてください
これでディレクトリ内のファイルにアクセスしにいくと403エラーがでるはずです。
次にURLの作成ですが
http://code.google.com/p/modaccesstoken/を見ると
http://example.com/protected/example.jpg?AccessKey=<AccessKey>&Expires=<Expires>&Signature=<Signature>
- AccessKey: httpd.conf 中であらかじめ設定しておいた AccessKey
- Expires: 有効期限 UNIX エポックからの秒数
- Signature: リクエストを認証する HMAC-SHA1 値を Base64 エンコードしたもの
Signature は以下の手順で生成します。
PlainText = <METHOD> + <URI> + <EXPIRES> + <ACCESS_KEY> Signature = Base64(HMAC_SHA1(PlainText, Secret))
となっているのでこの通りに作ります
私はPHPでやりました。
<? $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; ?> これでURLが出るのでダウンロードできるはずです。 他にもmod_access_tokenを解凍した中にegディレクトリがあるので その中のsign.plを使ってもURLが出せます。 ./sign.pl [URL] [accesskey] [secret] [time] アクセスできない場合はapacheのエラーログが出ているので確認 [error] Invalid signature: GET/test/test.zip12363129417864ffcb01fb5cde1f1c2f37b619fbcd => rMt/UI20T4yP0Vi+Ql5ltFNK/BM:1XeN4wx7A74ZNi7BNfEUi+86f3s Invalid signature: PlainText => <Signature1>:<Signature2> Signature1とSignature2が違うとエラーがでます。