2008-10-16 22:53:01
ファイルをダウンロードするために、REST requestで認証する方法はhttp://docs.amazonwebservices.com/AmazonS3/2006-03-01/index.html?RESTAuthentication.htmlに書いてある。
http://s3.amazonaws.com/(bucket)/(item)?AWSAccessKeyId=xxxxxx&Expires=0000000&Signature=yyyyyyyy
というように、ファイル名で決められるurlにAWSAccessKeyId、Expires、Signatureの3項目があればいいようだ。
最初のIDは自分のAWSAccessKeyIdだということは解る。有効期限は今から何分(何時間、何か月……)後までと自分で設定すればいいらしい。PHPでtimestampを使えば簡単に得られる。解らないのが、signatureである。全然解らないので、誰かが書いた例を見つけてきた。http://developer.amazonwebservices.com/connect/thread.jspa?messageID=82680に載っていたもの。
$accessKey = "<ACCESS KEY>"; $secretKey = "<SECRET KEY>"; $bucket = "<BUCKET>"; $item = "<OBJECT>"; $timestamp = strtotime("+3 days"); $strtosign = "GET\n\n\n$timestamp\n/$bucket/$item"; $signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true))); $url = " http://s3.amazonaws.com/$bucket/$item?\\ AWSAccessKeyId=$accessKey&Expires=$timestamp&Signature=$signature"; print "<a href='$url'>$url</a>";全然解らないけれども、この通りにやればurlができた。
これを、
function s3uri($pmid) { $accessKey = "xxxxxxxxxxx"; $secretKey = "xxxxxxxxxxxxxxxxxxxxxxx"; $bucket = "pdffiles-pmid"; $item = $pmid.".pdf"; $timestamp = strtotime("+10 minutes"); $strtosign = "GET\n\n\n$timestamp\n/$bucket/$item"; $signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true))); $url = " http://s3.amazonaws.com/$bucket/$item?\\ AWSAccessKeyId=$accessKey&Expires=$timestamp&Signature=$signature"; return $url; }というようにユーザ関数として設定して、urlを作成するのに使った。ちなみにここで、$pmidはPubMedのIDで、ここに登録されている論文一つ一つに付されている、固有の番号である。自分が持っている論文のpdfファイルをこの番号で管理すると何かと便利で、これで、論文の要旨をPubMedから取得したり、検索したりできる。pdfは自由に配布されているものは、わざわざ自分で保存する必要はないのだが、そうでないものも多いので、やはり自分で持っておきたい。というのは、例えば自分の所属している組織の図書館がとの学術雑誌の契約を解約してしまったりするとファイルを読めなくなってしまうのだ。そういう場合に備えてである。だから、これを世間に公表してしまって皆がダウンロードできるようにしてしまってはならないのである。認証をきちんとして、自分だけが利用できるようにしておかなければならない。
わかりにくい説明で申し訳ないが、そういうことなのだ。
ここまでで、ファイルを読み出せるようになったところである。次に自分のファイルをpdfファイルを除く情報は手元のコンピュータのMySQLにデータを保存して、pdf本体だけはamazon s3に保存するというスクリプトを書くのはまた明日以降にしよう。