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); } } }