■まず最初に認証用APIキーを取得するそんなわけで、早速はてな認証APIを使って認証をしたいのだが、その前に作るアプリがはてなから認証されないことにははてなによる認証サービスの利用ができない。
そんなわけで、サービスの認証を受けれるように認証用のAPIキーを取得する。
はてな認証API詳しい方法については上記リンク先を参照したらすぐにわかるので省略。
登録が完了すると下記のような画面が表示されます。
ここで重要になってくるのが“APIキー”と“秘密鍵”。
これを用いて以降の認証が行われます。
■次はアプリを作成する次はアプリケーションの作成。
と言っても今回ははてな認証APIの利用だけなので簡単に簡単にまとめる。
はてな認証APIの使い方を確認すると、以下のように記述されている。
アプリケーションにはてなアカウントの認証機能を搭載していきます。まず、あなたのアプリケーションから、はてな認証APIのログイン画面へリンクを行います。リンクの形式は以下のようになります。
http://auth.hatena.ne.jp/auth?api_key={api_key}&api_sig={api_sig}
api_key には先ほど取得した API キーを指定します。一方の api_sig は、このリクエストが開発者本人から送られた正しいものであることを確認するためのシグネチャです。このシグネチャは、同時に指定する他の URL パラメータの値、キー一覧にある秘密鍵の値を使って生成します。
3. ログイン用のリンクを作成する - はてな認証APIの使い方
ここでのポイントはシグネチャを生成しなければ認証できませんよ、ってこと。
どうせ書くならもっと強調して書いてほしいもんだ。
シグネチャの生成ロジックは以下のように実装してください。
* api_sig 以外に指定するパラメータを、パラメータ名でアルファベット順にソートする
* ソートされたパラメータを、"パラメータ名" "そのパラメータの値" の順ですべて文字列連結する
* 秘密鍵とこの連結されたパラメータ文字列「秘密鍵 + 連結したパラメータ文字列」の順で更に文字列連結する
* できあがった文字列を MD5 hex に変換する
ということMD5変換を行い、さらに16進数化する必要があるわけだ。
■アプリの前にMD5 HEX変換をの処理を行うと言うことで、どうってことない処理だが、とりあえず書いておく。
/// <summary>
/// 引数で与えられた文字列をMD5_HEX変換
/// </summary>
/// <param name="source">変換する基となる文字列</param>
/// <returns>変換後の文字列</returns>
private string ChangeMD5HEX(string source)
{
//文字列をbyte型配列に変換する
byte[] data = System.Text.Encoding.ASCII.GetBytes(source);
System.Security.Cryptography.MD5CryptoServiceProvider md5 =
new System.Security.Cryptography.MD5CryptoServiceProvider();
//ハッシュ値を計算する
byte[] bs = md5.ComputeHash(data);
//byte型配列を16進数の文字列に変換
System.Text.StringBuilder result = new System.Text.StringBuilder();
foreach (byte b in bs)
{
result.Append(b.ToString("x2"));
}
string strResult = result.ToString();
return strResult;
}
これで、引数に与えられた文字列をMD5変換し16進数化した文字列が返される。
■今度こそアプリケーションを!これで邪魔者はいなくなった。
やっとはてなと堂々とhogehogeできるわけだ。
//アクセスに用いるキー
string strApiKey = "hogehoge";
string strSercretKey = "hogehogeSercret";
//文字列をMD5_HEX変換する
string strApiSig = ChangeMD5HEX(strSercretKey + "api_key" + strApiKey);
//はてな認証APIのリンク先をセットする
string strAuthUrl = "http://auth.hatena.ne.jp/auth?"
+ "api_key=" + strApiKey + "&api_sig=" + strApiSig;
ここでstrAuthUrlには認証用URLが入っていることになる。
ちなみにまだこのサービスを使ってないはてなユーザーが、この認証用URLにアクセスすると、こんな画面が表示される。
この画面で、
“アカウント情報の読み取りを許可する”ボタンを押下するとサードパーティアプリによるアクセスを許可したことになる(つまりいくつかのはてなIDに関する情報をアプリを利用するために使っていいよって認めたことになる)わけだ。
■最後にはてなユーザー認証情報を取得するこの
“アカウント情報の読み取りを許可する”ボタンを押下した後どうなるのか、って事だけど、この後はアプリケーションを作成している開発者が指定したURLに遷移させて、その先の処理ではてなユーザーの認証情報を取得するわけだ。
ASP.netであればPageLoadのタイミングで、QueryStringに“cert”という情報が含まれているか確認をし、その情報があった場合、はてなユーザー認証情報を取得することができる。
cert の値が取得できたら、認証APIのURL(http://auth.hatena.ne.jp/api/auth.json)に HTTP GET リクエストを投げます。このとき GET リクエストに以下の三つの値をURLパラメータとして指定します。
* api_key
* cert
* api_sig
5. 認証APIを呼び出す - はてな認証APIの使い方
このときも同様に、MD5変換とHEX化が必要になる。
//アクセスに用いるキー
string strApiKey = "hogehoge";
string strSercretKey = "hogehogeSercret";
//認証確認コードの取得
string strCert = Request.QueryString.Get("cert");
//文字列をMD5_HEX変換する
string strApiSig = ChangeMD5HEX(
strSercretKey + "api_key" + strApiKey + "cert" + strCert);
//認証リクエストURLをセット
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create(
"http://auth.hatena.ne.jp/api/auth.xml?"
+ "api_key=" + strApiKey + "&cert=" + strCert + "&api_sig=" + strApiSig);
request.Method = "GET";
request.Accept = "application/xml";
//戻り値の取得
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
StringBuilder output = new StringBuilder();
output.Append(reader.ReadToEnd());
response.Close();
ここで戻り値としてHTTP GETリクエストの戻り値として得られる結果は、コードの中にある通りXMLの形式で取得されるわけだ。
・エラー時も含めた認証API のレスポンス例を以下に示します。
・認証API の URL の auth.json
の箇所を auth.xml
へ変更することで、結果を XML として取得することが可能です。
■JSON
--正常時
{
"has_error": false,
"user": {
"name": "hatena",
"image_url": "http://www.hatena.ne.jp/users/ha/hatena/profile.gif",
"thumbnail_url": "http://www.hatena.ne.jp/users/ha/hatena/profile_s.gif"
}
}
--エラー時
{
"has_error": true,
"error": {
message: "Invalid API key"
}
}
■XML
--正常時
<?xml version="1.0" encoding="utf-8" ?>
<response>
<has_error>false</has_error>
<user>
<name>hatena</name>
<image_url>
http://www.hatena.ne.jp/users/ha/hatena/profile.gif
</image_url>
<thumbnail_url>
http://www.hatena.ne.jp/users/ha/hatena/profile_s.gif
</thumbnail_url>
</user>
</response>
--エラー時
<?xml version="1.0" encoding="utf-8" ?>
<response>
<has_error>true</has_error>
<error>
<message>Invalid API key</message>
</error>
</response>
認証APIのレスポンス例 - はてな認証APIの使い方
■まとめ上記のコードではてな認証APIは利用することができます。
C#で作成しているので、VC++やVB.netでのアプリにも流用できると思います。
(コーディングの汚さについてのコメントは勘弁してください><)