DevQuiz for GDD : 2-legged OAuth (2)

android用の神経衰弱ゲームを公開しました(・∀・)
The Match-up(Memory) game for android was released!

Google Play:
Mole's Match-up.

Introduction page:
Mole’s Match-upをリリースした∩( ・ω・)∩


さてようやく実際に稼動するOAuthサンプルコードを入手できたので、
ようやく流用作業へと移る。ちなみにここまでで2-3日を消費していた…_| ̄|○

HttpClient4.0で実行時に変な警告が出る。
ぐぐったらHttpClient4.0でcookieの制御というページに回避法らしきことが書いてあったけれど、
よくわからない_| ̄|○ 特に致命的な問題ではなかったので見なかったことにした(´∩ω∩)ミテナイヨー

ごっぐるのサーバーとどんな通信をしてるのかが見たかったので、Socket Sniffを使用した。
これWindows用だったのか。


第一の壁 Authorizationヘッダの指定

Authorizationヘッダというものがよくわからない。
色々とぐぐったりDevQuiz for GDD : 2-legged OAuth (1)
開いたページなどを眺める……なんとなく、その名の通り認証用のヘッダということを
ようやく受け入れた_| ̄|○ HttpClientでAutorizationヘッダを指定すればいいのかって…
まあでもやり方わからへん(・∀・)

ということでHttpClientについてぐぐった。
【Java】HttpComponentsを使ってみる
HttpClient入門(HttpClient3.0-rc3)

わかったような、わからないような_| ̄|○
取り敢えずHttpPostクラスにURLを食わせてaddHeaderメソッドを色々と試す。
最終的には

httpPost.addHeader(“Authorization”,”OAuth realm=\”devquiz\””);

みたいに指定したらrealm絡みのエラーメッセージが消えた(・∀・)
realmというものがよくわからなくてぐぐった。

まずWebサーバでは、Basic認証の範囲(対象となるディレクトリやファイルの指定)の設定が必要になる。
HTTPサーバの種類によって、この方法は異なる。
例えばApacheでは、.htaccessファイルを用意する必要がある。
IIS(Internet Information Server)では、IISコンソールから、
「ディレクトリセキュリティ」タブ→「認証方法」から基本認証をチェックする。

 これらの1つの認証設定に対して「Realm(領域)」と呼ばれる、
特定するための名前を設定することができる。

HTTP(Hyper Text Transfer Protocol)~後編

認証絡みでWebサーバ側で指定されているものであり、クライアント側は与えられたrealmを使用して、
目的の認証を受けるというような感じなのかな?関係ないけどForgotten Realmってなんかあったなぁ。


第二の壁 AuthorizationヘッダにOAuthのパラメータを含める

OAuth のパラメータは、 Authorization ヘッダに含める形式 で送信してください。

何言ってるかよくわからない(・∀・)
次の条件、

POST データや GET パラメータに OAuth のパラメータを含める形式には対応していません。

と合わせて考えてみる。POSTデータやGETパラメータ…OAuthのパラメータ
んー(´・ω・`)、つまりoauth_signatureとかはPOSTのBodyに入れないでAuthorizationヘッダに
入れないと駄目ということか。そんなこと出来んのか。どうなんだ。

最初、やり方がわからず、
httpPost.addHeader(“Authorization”,”OAuth realm=\”devquiz\”&OAuthパラメータ”);
みたいな形にしたが

oauth_hogehoge is missing

みたいなエラーメッセージが返ってきてうまく行かず_| ̄|○ (この辺の記憶は暑さ故にちょっと曖昧)
Signitureの生成はOAuth認証+JavaからTwitterにポスト その3のコードを流用しているので問題ないはず。TwitterからRequestTokenを取得出来たことを鑑みれば、生成そのものはエラーの原因ではない。
OAuthパラメータの順序もきちんと昇順になっている…しかしエラーは返ってくる…
試しにOAuthパラメータを順番に一つずつ除去してリクエストをPOSTしてみた。
ん(´・ω・`)? 先頭のパラメータを除去した時以外はいつもmissingと言われるのは
常に二番目のパラメータか。ということは…別個に指定するのか…というか出来るのかな…
上書きされんじゃね?と思いつつ、addHeaderメソッドを複数回呼び出す……。

うまくいきやがった_| ̄|○ てっきりそのヘッダーを上書きしちゃうと思っていた__○_
まあ確かにメソッド名がaddHeaderだもんな。上書きはしないな__o_
まあつまりなんだ、

httpPost.addHeader(“Authorization”,”OAuth realm=\”devquiz\””);
httpPost.addHeader(“Authorization”,”oauth_consumer_key=” + CONSUMER_KEY);
httpPost.addHeader(“Authorization”,”oauth_nonce=” + getNonce());
httpPost.addHeader(“Authorization”,”oauth_signature_method=” + SIGNATURE_METHOD);
httpPost.addHeader(“Authorization”,”oauth_timestamp=” + timeStamp);
httpPost.addHeader(“Authorization”,”oauth_version=” + OAUTH_VERSION);
httpPost.addHeader(“Authorization”,”oauth_signature=” + signature);

っていうことかヽ(`Д´)ノ


エラーの文言変わったで(・∀・)

Invalid signature

無効なsigniture?と一瞬何のことやらと思ったが、”signitureはこうじゃないとおかしいよ。”
みたいなメッセージも付いてきたので、それを参考に修正した。


エラーの文言は

403 Forbidden You should send {‘hello’: ‘world’} as a POST parameter.

になった。ついにPOSTパラメータのとこまで来たで(`・ω・´)キタデキタデココマデキタデ


第三の壁 key=valueなPOSTデータ

富士登山における9合目の白鳥居は頂上じゃありません(`・ω・´)みたいな感じのトラップが。
簡単にすむと思っていたPOSTデータ”hello=world”で一時間くらいはまる_| ̄|○

単純にPOSTデータとして投げればいいんじゃないのかよヽ(`Д´)ノバーヤバーヤ
内容もよくわからないままに上記のHttpClient解説ページのコードを流用する。

try {
  List nvpList = new ArrayList();
  nvpList.add(new BasicNameValuePair(“hello”, “world”));
  httpPost.setEntity(new UrlEncodedFormEntity(nvpList, HTTP.UTF_8));
} catch (UnsupportedEncodingException e1) {
  e1.printStackTrace();
}

投げてみた。


200 OK Congraturations! You solved this problem.

キタ━━ヽ( ゚∀゚)ノヽ(゚∀゚ )ノ━━ !!!!!
結局かかりっきりではなかったけれど3日間かかったよ。・゚・(ノД`)・゚・。ヨロコビモヒトシオ


依存するライブラリは以下の物だけだったような気がするけれど検証するのめどい(・∀・)
今、ちょっとだけ簡単に試したら動いたので多分これで大丈夫。

  commons-lang-2.5.jar
  commons-logging-1.1.1.jar
  httpclient-4.0.1.jar
  httpcore-4.0.1.jar
 xercesImpl.jar 

詳細なコードという程ではないけれど流用改変したコードは2-legged OAuthに置いた(・∀・)
なんというかOAuthライブラリやgithubなどの文明の利器を扱えない原始人が頑張って火をつけて
狼煙をあげてようやくGoogleに認証してもらった感じ(ノ∀`)
とはいえこれでこの先OAuth絡みのサービスをいじる時のとっかかりは出来たような気がするので、
これはこれでよしとする。やっぱりDevQuizの楽しさというか良さの一つはこういうところだなぁ(・∀・)
得点配分は低いけど(w