API呼び出し

API呼び出しするときも利用者認証と同じ方法で署名を付ける必要がある。
違う点は、

  1. oauth_tokenはConsumer TokenとAccess Tokenを"&"で連結した文字列(だったはず・・・Access Tokenだけでよかったかも知れない)
  2. oauth_signatureを作成するときの共通鍵はConsumer SecretとAccess Secret
  3. POSTするメッセージも署名を作るときのパラメータに含める

と、ざっと書いただけでこんだけ。はっきり言って既存のライブラリがあるならそれを使った方が全然楽だと思います・・・(とくに、HMAC-SHA1とランダム文字列作る辺り)
情報セキュリティスペシャリスト(笑)的には抑えておきたかったのでDIYしてみたけど、丸一日使ってしまった・・・。

ユーザー許可認証

もらったピン子を使ってAccess TokenとAccess Secretを取得する。
方法は利用者認証の時と大体一緒なんだけど、以下の点が違う。

  1. oauth_tokenはRequest Token
  2. oauth_verifierパラメータを追加(値はピン子)
  3. oauth_sinatureを作成する時の共通鍵はConsumer SecretとRequest Secretを"&"で連結した文字列

上手く行けばAccess TokenとAccess Secretが帰ってくる。
こいつがあれば後はやり放題。

ユーザーに許可して貰う

リクエスト認証用URLにRequest TokenをパラメータにくっつけたURLをブラウザで開いてもらうと、接続先サービスにログインして(既にログインしている場合はそのまま)あんたのアカウント使って接続するけど、許可していい?って聞かれるので、許可する。
許可すると(クライアントアプリの場合)PINコード(以下、ピン子)が表示されるので、こいつを入力してもらう。

利用者認証

ここからが面倒、というか、ここの流れを理解出来ればあとはコレの応用。
基本的には、以下のものをリクエスト認証用URLに投げてRequest TokenとRequest Secretを貰うんだけど、これがまためんどい。
ここから何をするにも必要なもの。基本的にはリクエストのクエリとしてくっつける。

  1. oauth_token(ここではConsumer Token)
  2. oauth_timestamp(UNIX時間のタイムスタンプ)
  3. oauth_nonce(ランダム生成した文字列)
  4. oauth_signature_method(署名の生成方式。twitterだとHMAC-SHA1
  5. oauth_version(基本的に1.0)
  6. oauth_signature(共通鍵を使ったリクエストの署名)

で、oauth_sinatureを作るために以下の手順を踏む必要がある。

  1. HTTPメソッド名
  2. 宛先URL
  3. 上記のなかからoauth_signatureを除いたクエリ文字列(他に必要なパラメータがあればそれも含める)

上記3つをURLエンコードした後"&"で接続した文字列を、oauth_signature_methodで指定した方式で必要な共通鍵を&で連結したもの(ここではConsumer Secert+"&")をキーに署名を取得、base64エンコードする。これがoauth_signatureになる。
で、めでたくクエリが完成したらリクエスト用URLにクエリをくっつけて投げる。
上手く行けば、Request TokenとRequest Secretが帰ってくる。
署名が変だったり、typoしてたりすると認証失敗したよーってメッセージが帰ってくるので、その時はやり直し。

基本の流れ

まずは、流れ。

  1. 接続したいサービスに登録して(今回はtiwitter)Consumer Token(利用者IDみたいなもの)とConsumer Secret(利用者を確認するための共通鍵)を発行してもらう。
  2. 発行してもらったConsumer Tokenを使って利用者認証をして、Request Token(リクエスト用の一時トークン)とRequest Secret(Request Tokenを確認するための共通鍵)を発行してもらう。
  3. Request Tokenを使ってユーザをサービスに誘導し、接続を許可して貰う。(このとき、クライアントアプリであればPINコード(認証コード)が発行される)
  4. 発行されたPINコードとRequest Tokenを使ってAccess Token(ユーザ専用の利用者IDのようなもの)とAccess Secretを発行してもらう(Access TokenとConsumer Tokenが正しいかを確認するための共通鍵)
  5. あとは、Access Tokenを使ってAPIを呼び出す。

・・・ってここまで書いた時点でかなりめんどいんだけど、実際めんどかった・・・。