ここ数日頭がいっぱいいっぱいでblogネタがない。
ので、「そんなの自分のメモに書いておけよ」てきなネタをたまには。
ネタ的に今更感たっぷりだけれど、
APIを通して写真をアップロードしたり、あるユーザのプライベート設定された写真を扱ったりするためには、ユーザの認証を得てTokenを得なければならない。
TokenはFlickrアプリ(api_key)とユーザ(user_id)の組み合わせにつき1つ発行される内緒の文字列。
このTokenをつかってAPIを叩くといろいろ出来るようになる。
メカニズムの解説は
Flickr API の認証 - まちゅダイアリー(2005-11-01)
を参考にしてもらうとして、手っ取り早く実装する方法を。
使ったスクリプトはPHP5。
今回はユーザ側も自分で操作したのでだいぶ手抜き。
Webアプリに組み立てるのはおまかせします。
Tokenの取得手順

上から順に。
FlickrAPIの取得
これは通常のアプリ開発の通り。
Flickrのアカウントを取得した後Flickr Servicesに必要項目を入力して取得。
KeyとSecretを控えておく。
コールバック先URL設定
ユーザがAPIによるアクセスへの認証を認めた後に飛び、frobを取得するぺージのURLをFLickrに設定する。
Flickr Servicesの「Edit key details」をクリックし、下方のAuthentication Typeで"Web application"を選び、Callback URLにコールバック先のURLを設定。
このコールバック先はgetで値が取得できる必要がある。
これはapi_key1つにつき同時に1つしか設定できない。
ちなみに、最もシンプルにやるにはコールバック先のURLに以下のスクリプトを置けばよい。
<?php
print_r($_REQUEST);
?>
認証要求URL生成
ユーザにサクセスして認証をしてもらうページのURLをつくる。
Flickrはapi_keyとsecretのペアでアクセス判別をしているが、secretはヒミツにするため、パラメータのmd5となるシグネチャを作成する。
シグネチャの元となる文字列は以下のように作成
[Secret]api_key[ApiKey]perms[permission]
[Secret],[Api_Key]には先ほどのapi keyとsecret、permissionには "read"か"write"を指定。
プライベートな写真を読むなど読み取りの権利のみ取得したい場合はread、
それらにくわえ写真のアップロードやメタデータの書き換えなども必要な場合はwrite。
たとえばapi keyがaaaaaaa、secretがbbbbbでwriteパーミッションを取得する必要がある場合は
bbbbbapi_keyaaaaaaapermswrite
となる
上で生成した文字列をmd5でひねる
md5を作るコマンドラインスクリプトは以下の通り
#!/usr/bin/php
<?php
echo md5($argv[1])."\n";
?>
上の文字列の場合
$ ./md5.php bbbbbapi_keyaaaaaaapermswrite
で
2da2c4a7a5572aab7c97f268242acd03
を取得。
ユーザにアクセスさせるURLは以下のようになる
http://flickr.com/services/auth/?api_key=[api key]&perms=[permission]&api_sig=[signature]
上の場合は
http://flickr.com/services/auth/?api_key=aaaaaaa&perms=write&api_sig=2da2c4a7a5572aab7c97f268242acd03
ユーザによる認証
ユーザに認証をしてもらうために、Flickrのユーザに上で生成したURLにアクセスしてもらう。
(Flickrにログインしてない状態の場合はログイン画面を経由して)飛んだページで、以下のボタンを押してもらう

するとユーザは先ほど設定したコールバック先アドレスに飛ぶ。
frobの取得
飛んだ先のページにfrobと言う名前のgetパラメータでfrobの値が渡される
先ほどのスクリプトの場合
Array
(
[frob] => xxxxxx-yyyyyyyy-zzzzzzz
)
のようになるはず。
このfrobと言うのが何のために作られたのか分からないが、Tokenを得るために必要な中間地点。
frobをひかえておく
Token取得URLを生成
先ほどの認証要求URLの生成と似たかんじで、flickr.auth.getTokenToken APIをたたいてTokenを得るためのURLを生成
シグネチャを作成
シグネチャの元となる文字列は以下のように作成
[Secret]api_key[Api Key]frob[Frob ]methodflickr.auth.getToken
上の例だと以下のようになる
bbbbbapi_keyaaaaaaafrobxxxxxx-yyyyyyyy-zzzzzzzmethodflickr.auth.getToken
これをmd5でひねる
$ ./md5.php bbbbbapi_keyaaaaaaafrobxxxxxx-yyyyyyyy-zzzzzzzmethodflickr.auth.getToken
で
4accb826087454b8210f5b45527a243f
を取得。
これをもちいてToken取得URLは以下のようになる
http://flickr.com/services/rest/?method=flickr.auth.getToken&api_key=[Api Key]&frob=[Frob ]&api_sig=[signature]
上の例だと以下のようになる
http://flickr.com/services/rest/?method=flickr.auth.getToken&api_key=aaaaaaa&frob=xxxxxx-yyyyyyyy-zzzzzzz&api_sig=4accb826087454b8210f5b45527a243f
Token取得
すぐ上で生成したのURLにアクセスすると、XMLでユーザのTokenやユーザのIDなどがえられる
<rsp stat="ok"><br />
<auth><br />
<token>[ここにTokenがかかれる]</token><br />
<perms>read</perms><br />
<user nsid="[ユーザのID]" username="[ユーザ名]" fullname="[スクリーン名]"><br />
</user><br />
</auth></rsp>
このTokenを他に漏れないように保存して、一件落着。