はてな認証API
乗り遅れた感が強いですがはてな認証APIをJavaで実装してみたのでログを残しておきます。
■認証メインクラスのモジュール
■認証メインクラスのソース
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;
}
}
■主な使い方
////インスタンス生成
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を使って何か面白いものを作ろうと思案中です。
おすすめ度の平均: