2013年6月16日日曜日

GAE + Go で Sign in with Twitter (2)

昨日に続きまして GAE + Go で Twitter ログインです。

公式ドキュメントはこちら
 Sign in with Twitter
 https://dev.twitter.com/docs/auth/sign-twitter



今回の内容はこちらの Step.1 に該当します
 Implementing Sign in with Twitter
 https://dev.twitter.com/docs/auth/implementing-sign-twitter


Authorization Header

GAE のアプリから Twitter へ HTTP リクエストを送信することで認証を進めます。
Twitter はセキュリティ上、リクエストを送ってきたアプリが、事前に登録されたアプリであることを確認する必要があります。

登録されたアプリかどうかは、アプリ登録時にもらえる consumer keyconsumer secret を使って確認します。consumer key はアプリのID、consumer secret はアプリのパスワードのようなものです。

Twitter へ送信されるリクエストの1つを見てみましょう。
POST /oauth/request_token HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: api.twitter.com
Accept: */*
Authorization: 
  OAuth oauth_callback="http%3A%2F%2Flocalhost%2Fsign-in-with-twitter%2F",
  oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w",
  oauth_nonce="ea9ec8429b68d6b77cd5600adbbb0456",
  oauth_signature="F1Li3tvehgcraF8DMJ7OyxO4w9Y%3D",
  oauth_signature_method="HMAC-SHA1",
  oauth_timestamp="1318467427",
  oauth_version="1.0"


ここで重要になるのが Authorization ヘッダです。Tiwtter へ送るすべてのリクエストには Authorization ヘッダが含まれます。

この中の oauth_signature が登録したアプリ自身であることを証明する署名データです。上の例では oauth_signature="F1Li3tvehgcraF8DMJ7OyxO4w9Y%3D" の部分です。

また、oauth_signature 以外にも色々と送らなければいけません。何を送るかは OAuth 1.0a にて定義されています。


Authorization ヘッダに関する Twitter のドキュメントはこちら
 Authorizing a request - Twitter Developers
 https://dev.twitter.com/docs/auth/authorizing-request



Authorization ヘッダは基本的に 7 つのパラメータから構成されています。
それぞれ oauth_****** という名前が付いています。


1. oauth_callback

Twitter のログインが完了した後にリダイレクトされる URL を指定します。
とりあえずアプリの URL をそのまま使います。
開発が進んだら適切な URL へ変更してください。 

この画面から戻る先のURLです


2. oauth_consumer_key


Twitter にアプリを登録した際に1つだけ割り当てられる ID です。
登録した Twitter アプリケーションの詳細ページから確認できます。
アプリの ID だと思って大丈夫です。

ここの右側に表示されている文字列です

3. oauth_nonce

他のリクエストと識別するためのランダムな文字列です。
oauth_timestamp と合わせて過去に同じリクエストが送られたかどうかを判断するために使われます。
同じリクエストを1度しか受け付けないことで、リプレイ攻撃を防げます。
ランダムな文字列ならなんでも良いですが、今回は Twitter の公式ドキュメントと同じように、「32byte のランダムなデータを base64 エンコードした後、記号を削除した文字列」を使います。

4. oauth_signature

登録されたアプリであることを証明する署名データです。
oauth パラメータや HTTP メソッドなどを含む文字列を、Twitter とアプリ管理者だけが知っている秘密鍵 consumer_secret で暗号化することで、署名とデータの改竄検出が可能になります。
暗号化に使われるメソッドは Twitter の場合、HMAC-SHA1 が使われます。
oauth_signature の作成は他のデータと比べると複雑でバグが出やすいので要注意です。

5. oauth_signature_method

署名データを暗号化するアルゴリズムを指定します。
Twitter は HMAC-SHA1 で固定です。

6. oauth_timestamp

リクエストが作成された時刻を表す UNIX Timestampです。
oauth_nonce と合わせてリプレイ攻撃を防ぎます。
また、現在よりも離れている時間が設定されているとエラーが返されます。
コンピュータの時計が正しく設定されているかを確認することが大事です。
ただし、GAE の場合は時計のずれは気にしなくてよいでしょう。

7.  oauth_version

OAuth のバージョンです。Twitter では "1.0" で固定です。
ちなみに正確には OAuth 1.0 を修正した OAuth 1.0 Revision A(OAuth1.0a) が採用されています。

以上の 7 つの oauth パラメータを Authorization ヘッダに含めて送信します。
リクエストを受け取った Twitter は自分でも HMAC-SHA1 で oauth_signature の値を計算して、リクエストに含まれる oauth_signature と一致するか調べます。
一致したら、登録したアプリであることを認めてリクエストに答えます。


今日はここまで

0 件のコメント:

コメントを投稿