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へのリンクにしました。