技術メモ

mod_access_token

(更新 )

この記事にはプロモーション(広告)を含みます。 詳しくはこちら

有効期限を指定して一時的なダウンロードを許可することができる素敵モジュール。
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が違うとエラーがでます。

 

コメントを書く

コメントの取り扱いについては、プライバシーポリシーをご覧ください。

CAPTCHA