livedoor ラボ「EDGE」 開発日誌 : 「mod_access_token」の配布開始と「EDGE src」公開のお知らせ - livedoor Blog(ブログ)
ウェブサイト上の画像やファイルに有効期限を指定して、ユーザーに一時的なダウンロードを許可する、ライブドアで独自開発したApacheモジュールです。このモジュールをApache Webサーバに組み込むことにより、画像やファイルをウェブ上で公開するときに有効期限をつけることができるようになり、Webアプリケーションと組み合わせる事で公開範囲の制御を行なう事が可能になります。
http://blog.livedoor.jp/edge_labs/archives/717201.html
modaccesstoken - Google Codeソースコード見たら依存が浅かったのでWindowsでビルドしてみた。
mod_access_token provides access token based secure downloading.
http://code.google.com/p/modaccesstoken/
Makefile.w32
APACHE_ROOT=C:\Program Files\Apache Software Foundation\Apache2.2
CFLAGS=/I"$(APACHE_ROOT)\include" /DWIN32 /nologo
LDFLAGS=/LIBPATH:"$(APACHE_ROOT)\lib"
LIBS= libapr-1.lib libaprutil-1.lib libhttpd.lib
all : mod_access_token.so
mod_access_token.so : mod_access_token.obj
link /nologo /DLL /OUT:$@ /EXPORT:access_token_module mod_access_token.obj $(LDFLAGS) $(LIBS)
mod_access_token.obj : mod_access_token.c
cl -c $(CFLAGS) mod_access_token.c
なぜかmingw32では実行時にエラーが出たのであきらめました。VC6では可変長マクロが使えないので最終的にはVC8でしか試せませんでした。ビルドしたモジュールを
C:\Program Files\Apache Software Foundation\Apache2.2\modules\
に置き、httpd.confへLoadModuleを追加。対象のフォルダに以下の様に設定(.htaccess)します。.htaccess
AccessTokenCheck On
AccessTokenAccessKey foo
AccessTokenSecret bar
このAccessTokenAccessKey(foo)が公開鍵、AccessTokenSecret(bar)が秘密鍵になります。認証はREADMEに書かれている通り
download.pl
use strict;
use URI;
use Digest::HMAC_SHA1;
my $access_key = 'foo';
my $secret = shift || die('specify secret key!');
my $exp = time + 300; # 5minutes
my $url = 'http://localhost:8080/access_token/example.jpg';
my $uri = URI->new( $url );
my $plain = sprintf '%s%s%s%s', 'GET', $uri->path, $exp, $access_key;
my $hmac = Digest::HMAC_SHA1->new( $secret );
$hmac->add( $plain );
my $sig = $hmac->b64digest;
$uri->query_form({
Signature => $sig,
AccessKey => $access_key,
Expires => $exp,
});
printf "%s\n", $uri->as_string;
といった感じ。キーが間違ってるとDECLINED(Forbidden)になります。内部はSHA1による認証処理になってます。
誰ですか!「WindowsなんてマイナーなOSのことは知りません」とか言ってるの!(謎)
追記
パッチを当てないと動かなかったのを忘れてました。
Index: mod_access_token.c
===================================================================
--- mod_access_token.c (revision 3)
+++ mod_access_token.c (working copy)
@@ -2,10 +2,12 @@
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
+#include "http_request.h"
#include "http_log.h"
#include "ap_config.h"
#include "apr_sha1.h"
#include "apr_strings.h"
+#include "apr_base64.h"
#include "apr_lib.h"
#define ACCESS_KEY_NAME "AccessKey"