OAuth認証+JavaからTwitterにポスト その3
サンプルソースはまとめてgithubにあります
http://github.com/tototoshi/OAuthSample
とりあえず、request tokenを取得するJavaプログラム
https://github.com/tototoshi/OAuthSample/blob/master/java/src/main/java/com/github/tototoshi/oauth/twitter/RequestToken.java
https://github.com/tototoshi/OAuthSample/blob/master/java/src/main/java/com/github/tototoshi/oauth/twitter/OAuthUtil.java
RequestToken.javaの説明
getRequestParameter()
private String getRequestParameters() { return "oauth_consumer_key=" + CONSUMER_KEY + "&" + "oauth_nonce=" + URLEncode(getNonce()) + "&" + "oauth_signature_method=" + SIGNATURE_METHOD + "&" + "oauth_timestamp=" + getTimeStamp() + "&" + "oauth_version=" + OAUTH_VERSION ; }
必要とされてるパラメータつなげてるだけです。
nonceはgetNonce()で取得し、それをエンコードしています。timestampとかconsumer keyとかも必要に応じてしてください。多分する必要はないけど。
getNonce()の中身ですが、commonsで便利そうなライブラリがあったのでそれ使いました。
getTimeStamp()もまあ適当に。
oauth_signature_methodですが、twitterで対応してるのはHmacSHA1らしいのでそれを指定します。
oauth_versionは1.0
request parameterが得られたので、これをもとにgetSignatureBaseString()メソッドでsignature(署名)の元になる文字列を作っています。
private String getSignatureBaseString(String requestParameters) { return "GET&" + OAuthUtil.URLEncode(REQUEST_TOKEN_URL) + "&" + OAuthUtil.URLEncode(requestParameters); }
HTTPメソッド + request token URL をエンコードしたもの + request parameterをエンコードしたもの。
HTTPメソッドですが、OAuthの仕様にはPOST推奨と買いてありましたが、TwitterはGETを指定しているのでGETで。
これでsignature base stringが出来上がりました。
これでやっとsignatureが作れる。
とその前に(まだあんのかよ。。。)
keyを作らなきゃいけません。
private String getKeyString(){ if(oauthToken == null){ return CONSUMER_SECRET + "&"; }else{ return CONSUMER_SECRET + "&" + oauthToken; } }
consumer secret(Twitterにアプリ登録したときもらったやつ)とoauth tokenを「&」でつなぎます。
といってもoauth tokenは今まさに取得しようとしてるわけで、まだありません。
だから必要ありませんが、ここで注意。「&」は必要です。
これでsignatureを作る準備完了
getSignature()はbase stringとkeyからsignatureを作るメソッドです。
private String getSignature(String signatureBaseString, String keyString){ String signature = null; String algorithm = "HmacSHA1"; try { Mac mac = Mac.getInstance(algorithm); Key key= new SecretKeySpec(keyString.getBytes(), algorithm); mac.init(key); byte[] digest = mac.doFinal(signatureBaseString.getBytes()); signature = URLEncode(Base64.encode(digest)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } return signature; }
HmacSHA1アルゴリズムでハッシュ→Base64→URLエンコードが手順です。
これでsignatureが得られました。やっとだ。。。
このsignatureをくっつけてリクエスト送ります。
↓こんな感じ。あ、commons-httpclient使ってます。
String req = REQUEST_TOKEN_URL + "?" + requestParameters + "&oauth_signature=" + signature; HttpGet httpGet = new HttpGet(req);
うまく行けば、
oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&oauth_token_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&oauth_callback_confirmed=true
こんな感じのresponseが返ってきます。
oauth_tokenがrequest tokenで、oauth_token_secretはそれと対になるパスワードです。
これをもとに次回はaccess tokenを取得、するわけですが、疲れたので次回。
2011/09/09 修正しました。コードの部分をgithubへのリンクにしました。