だれかのメモ帖

テクノロジー全般のメモ

Zaimのリクエストトークン取得ができない話

Javaの勉強のために「とりあえず、なにか作ろう」と思い、ZaimのAPIを叩いたアプリケーションを作ろうとしています。

が、最初の第一歩であるoauth認証で積んだのでメモ。
勉強も兼ねて、一から自分でやったる、と思って色々なところを参考にヘボクラスを作りました。

だが、Zaimのリクエストトークン用のURLにアクセスしても400を吐かれます。。。
しかし、Twitterで実験してみると、こちらでは上手くいきます。

ついでに、rubygemのoauthライブラリで実験したみたところ。やはりTwitterはリクエストトークンが返ってくるのに、Zaimでは400です。。。

というわけで、原因を調査中です。

public class OauthImpl {
	private URL url;
	private URLConnection ucon;
	
	private String consumerkey = "";
	private String consumerSecret = "";
	private String oauth_nonce = "";
	private String oauthToken = ""; 
	private String oauthTokenSecret = "";
	private String oauthSignature="";
	private String oauth_timestamp = "";

	private SortedMap<String, String> params;
	public OauthImpl(String url,String consumerkey,String consumerSecret) {
		try {
			this.url = new URL(url);

			this.consumerkey = consumerkey;
			this.consumerSecret = consumerSecret;
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	public void httpGet() {
		HttpURLConnection huc = (HttpURLConnection) this.ucon;
		try {
			huc.setRequestMethod("GET");
			huc.connect();
			BufferedInputStream bis = new BufferedInputStream(
					huc.getInputStream());
			int data;
			while ((data = bis.read()) != -1)
				System.out.write(data);

		} catch (ProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	public void sendRequestPost() throws Exception {
		this.oauth_timestamp = String.valueOf(new Long(System
				.currentTimeMillis() / 1000L));
		double ran = Math.random();
		this.oauth_nonce = Double.toString(ran);
		params = new TreeMap<String, String>();
		params.put("oauth_consumer_key", consumerkey);
		params.put("oauth_signature_method", "HMAC-SHA1");
		params.put("oauth_timestamp", this.oauth_timestamp);
		params.put("oauth_nonce", this.oauth_nonce);
		params.put("oauth_version", "1.0");
		params.put("oauth_callback", "oob");
		{
		//signature is constructed
			String paramStr = "";
			// 昇順で並べる
			for (Entry<String, String> param : params.entrySet()) {
				paramStr += "&" + param.getKey() + "=" + param.getValue();
			}
			// first "&" should be removed
			paramStr = paramStr.substring(1);
	
			String text;
			String signature = null;
			text = urlEncode("POST") + "&" + urlEncode(this.url.toString()) + "&"
					+ urlEncode(paramStr);
			// System.out.println("text = \n"+text);
	
			String key = urlEncode(this.consumerSecret) + "&";
	
			SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
			Mac mac = Mac.getInstance(signingKey.getAlgorithm());
			mac.init(signingKey);
			byte[] rawHmac = mac.doFinal(text.getBytes());
			signature = BASE64Encoder.encode(rawHmac);
			this.oauthSignature = signature;
			params.put("oauth_signature", signature);
		}
		String paramStr = "";
		for (Entry<String, String> param : params.entrySet()) {
				paramStr += "," + param.getKey() + "=\""
						+ urlEncode(param.getValue()) + "\"";
	
		}
		paramStr = paramStr.substring(1);
		String authorizationHeader = "OAuth " + paramStr;
		
		HttpURLConnection huc = (HttpURLConnection)  this.url.openConnection();
		huc.setRequestMethod("POST");
		// huc.setDoOutput(true);
		// System.out.println(this.createAuthHeader());
		huc.setRequestProperty("Authorization", authorizationHeader);
		huc.connect();
	
		BufferedReader reader = new BufferedReader(new InputStreamReader(
				huc.getInputStream()));
		String response;
		while ((response = reader.readLine()) != null) {
			System.out.println(response);
		}

	}


	private String urlEncode(String str) {
		try {
			return URLEncoder.encode(str, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
	}
}