2010年10月3日日曜日

mixi Graph APIの認証

http://developer.mixi.co.jp/connect/mixi_graph_api/api_auth

にある認可方法のJava実装の説明です。


まず、使用するには開発者登録を行い
https://sap.mixi.jp/
で新規サービス追加を行っておく必要があります。

まずURLを作って以下にリダイレクトします。
  1. String endPoint = "https://mixi.jp/connect_authorize.pl";  
  2.   
  3. String url = endPoint + "?response_type=code";  
  4.   
  5. String key = "キー";  
  6. String scope = "r_profile";  
  7. String display = "pc";  
  8.   
  9. url += "&client_id=" + key;  
  10. url += "&scope=" + scope;  
  11. url += "&display=" + display;  
  12.   
  13. return redirect(url);  

※redirect関数はslim3の関数です。
 このURLにリダイレクトすればOKです。

するとmixiの認証画面に飛びます。
許可がおりるとサービスを作成した際のURLに遷移します。
キーにはサービス作成後に生成される「Consumer Key」を指定しておきます。
r_profileの指定は使用するサービスによって変更します。

認可手順のところに記述してありますね。


  1. //コードを取得  
  2. String token = requestScope("code");  
  3. String endPoint = "https://secure.mixi-platform.com/2/token";  
  4. String args = "";  
  5.   
  6. String key = "サービスのKEYを指定";  
  7. String scret = "サービスのSECRETを指定";  
  8. String uri = "http://mixi.latest.secondarykey.appspot.com/callback";  
  9.   
  10. args += "grant_type=authorization_code";  
  11. args += "&client_id=" + key;  
  12. args += "&client_secret=" + scret;  
  13. args += "&code=" + token;  
  14. args += "&redirect_uri=" + uri;  
  15.   
  16. String json = post(endPoint,args);  
  17. Map<string,string> jsonMap = createJsonMap(json);  
  18.   
  19. String email = "メールアドレス";  
  20. String url = "http://api.mixi-platform.com/2/search/people?q=" + email;  
  21. //String url = "http://api.mixi-platform.com/2/people/@me/@self";  
  22.   
  23. get(url,jsonMap.get("access_token"));  
  24.   
  25. return forward("oauth.jsp");  
  26. ,string>  


飛んできたURLの引数で「code」がきますので
それを元にURLを作成します。
「redirect_uri」は、、、、何設定するのかな?多分合ってない気がする。。。
それをPOSTで投げます。
post()はオリジナルでHttpURLConnectionを利用して投げています。

その戻り値はjsonで戻ってきます。
  1. {"refresh_token":"a4a634845360522a85cc030e043cb869d2536aa",  
  2. "expires_in":900,  
  3. "access_token":"8b17d199e43c879c1a015019cf55d9ecd0e2503",  
  4. "scope":"r_profile"}  

こういう感じのjsonです。

この「access_token」を利用して、利用したいサービスにサクセスします。
ここではPeople lookup APIにアクセスして、
マイミクの情報を取得しています。

get()ではHttpURLConnectionに対して
  1. connection.setRequestProperty("Authorization""OAuth " + oauth);  


と認証情報にアクセストークンを指定する必要があります。

このブログを記述している時点では
メールアドレスによる検索は認可されたユーザの
マイミクでないと検索できないようで、404を返してきていました。
テスト時に自分のメールアドレスを検索してて
「なんで404なんじゃー!」って思っていましたが、仕様のようです。