はてな認証API


乗り遅れた感が強いですがはてな認証APIJavaで実装してみたのでログを残しておきます。


動作ページ


■認証メインクラスのモジュール


ダウンロード


■認証メインクラスのソース



import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.TreeMap;


/**

 * はてなAPI認証関係クラス

 * @author 2ca3

 *

 */

public class Auth {

 /** 秘密鍵 */

 private String secretKey;

 /** 基底パラメータ格納 */

 private Map baseParamsMap;


 /**

  * Authクラスのコンストラクタ

  * @param _secretKey

  * @param _apiKey

  */

 public Auth(String _secretKey, String _apiKey) {

  secretKey = _secretKey;

  baseParamsMap = new HashMap();

  baseParamsMap.put("api_key", _apiKey);

 }


 /**

  * ログインURL取得

  * @return ログインURL

  */

 public String getLoginUrl() {

  return getLoginUrl(null);

 }


 /**

  * ログインURL取得(追加パラメータ有り)

  * @param _addParams

  * @return ログインURL

  */

 public String getLoginUrl(Map _addParams) {

  return "http://auth.hatena.ne.jp/auth?"

    + makeSortParamStr(makeParamsMap(_addParams));

 }


 /**

  * ユーザ情報URL(JSON)取得

  * @param _cert

  * @return ユーザ情報URL(JSON)

  */

 public String getUserInfoJsonUrl(String _cert) {

  Map addParams = new HashMap();

  addParams.put("cert", _cert);

  return getUserInfoJsonUrl(addParams);

 }


 /**

  * ユーザ情報URL(JSON)取得(追加パラメータ有り)

  * @param _addParams

  * @return ユーザ情報URL(JSON)

  */

 public String getUserInfoJsonUrl(Map _addParams) {

  return "http://auth.hatena.ne.jp/api/auth.json?"

    + makeSortParamStr(makeParamsMap(_addParams));

 }


 /**

  * ユーザ情報URL(XML)取得

  * @param _cert

  * @return ユーザ情報URL(XML)

  */

 public String getUserInfoXmlUrl(String _cert) {

  Map addParams = new HashMap();

  addParams.put("cert", _cert);

  return getUserInfoXmlUrl(addParams);

 }


 /**

  * ユーザ情報URL(XML)取得(追加パラメータ有り)

  * @param _addParams

  * @return ユーザ情報URL(XML)

  */

 public String getUserInfoXmlUrl(Map _addParams) {

  return "http://auth.hatena.ne.jp/api/auth.xml?"

    + makeSortParamStr(makeParamsMap(_addParams));

 }


 /**

  * パラメータMapの生成

  * @param _addParams

  * @return パラメータMap

  */

 private Map makeParamsMap(Map _addParams) {

  Map m = new HashMap(baseParamsMap);

  if (_addParams != null){

   m.putAll(_addParams);

  }

  String apiSig = getApiSig(m);

  m.put("api_sig", apiSig);

  return m;

 }


 /**

  * パラメータMapをソートしてString化

  * @param _params

  * @return パラメータソート済みString

  */

 private String makeSortParamStr(Map _params) {

  Iterator it = (new TreeMap(_params)).keySet().iterator();

  String sortConcatParamsStr;

  String key;

  for (sortConcatParamsStr = ""; it.hasNext(); sortConcatParamsStr = sortConcatParamsStr

    + "&" + key + "=" + _params.get(key)) {

   key = (String) it.next();

  }

  if (sortConcatParamsStr.startsWith("&")){

   sortConcatParamsStr = sortConcatParamsStr.substring(1);

  }

  return sortConcatParamsStr;

 }


 /**

  * シグネチャの取得

  * @param _params

  * @return シグネチャ

  */

 private String getApiSig(Map _params) {

  try {

   String sortConcatParamsStr = makeSortParamStr(_params);

   return toMD5HexString(secretKey

     + sortConcatParamsStr.replaceAll("&|=", ""));

  } catch (NoSuchAlgorithmException e) {

   e.printStackTrace();

  }

  return null;

 }


 /**

  * MD5 hex に変換

  * @param str

  * @return MD5 hex

  * @throws NoSuchAlgorithmException

  */

 private String toMD5HexString(String str) throws NoSuchAlgorithmException {

  MessageDigest md5 = MessageDigest.getInstance("MD5");

  md5.update(str.getBytes());

  return toHexString(md5.digest());

 }


 /**

  * hex に変換

  * @param buf

  * @return hex

  */

 private String toHexString(byte buf[]) {

  String s = "";

  for (int i = 0; i < buf.length; i++) {

   int n = buf[i] & 0xff;

   if (n < 16){

    s = s + "0";

   }else{

    s = (new StringBuffer(String.valueOf(s))).toString();

   }

   s = s + Integer.toHexString(n).toLowerCase();

  }


  return s;

 }

}


 


JavaDoc


■主な使い方



////インスタンス生成


String secretKey = "1234567890abcdef";


String apiKey = "56eeb1ced90dece9862221ea979a9905";


Auth auth = new Auth(secretKey, apiKey);


////ログイン用URLの取得


String url = auth.getLoginUrl();


////JSONでユーザ情報を取得するためのURLを取得


String url = auth.getUserInfoJsonUrl(req.getParameter("cert"));


////XMLでユーザ情報を取得するためのURLを取得


String url = auth.getUserInfoXmlUrl(req.getParameter("cert"));


////必須パラメータ(api_keyとかapi_sigとか)以外にパラメータを付加したい場合のURL取得


Map m = new HashMap();


m.put("name1", "value1");


m.put("name2", "value2");


m.put("name3", "value3");


//ログイン用URL


String url = auth.getLoginUrl(m);


//JSONでユーザ情報取得するURL


String url = auth.getUserInfoJsonUrl(m);


//XMLでユーザ情報取得するURL


String url = auth.getUserInfoXmlUrl(m);


■その他


MD5を求める部分はこのページの結城さんのソースをほぼそのまま使わせてもらいました。


全体的にあまりテストはしていないです。


このAPIを使って何か面白いものを作ろうと思案中です。



Java基本API+Jakarta逆引きリファレンス


WINGSプロジェクト 山田 祥寛

技術評論社 (2004/04)

売り上げランキング: 53,580



おすすめ度の平均: 5
5 基本~応用テクニックが満載