2011年6月2日木曜日

Evernoteにアクセスする その2 OAuthアクセス編


前回サンプルを動作させてみました。
サンプルはOAuthの動作を見せる感じに作ってあります。
JSPに書かれていて処理がわかりずらいのでコードを解析しながら読みやすくしていきましょう。

最初の方は定数等を定義していますね。
  1. private enum supportedRedirSchemas {FULL, EMBED};  


は、iframeを利用する場合の処理の分岐ですね。
少し分かりづらいですが、基本的にindex.jspに対して、
「action」という引数を渡して処理を行ってます。


  1. getRequestTokenの処理

  2. Evernoteにアクセス(引数なし)

  3. 認証後getAccessTokenの処理

  4. AccessTokenによりlistNotebooks



という順序で処理を行っています。
これはRequestTokenを準備してEvernoteにアクセスして
認証結果をAccessTokenで取得。
最後にAPIにアクセスしている感じです。

まぁご存知「OAuth1.0」アクセスです。
まずはgetRequestTokenによるrequestTokenの取得です。

サンプルのはじめのリンクをクリックした時の処理

  1.           SimpleOAuthRequest oauthRequestor =  
  2.             new SimpleOAuthRequest(requestTokenUrl, consumerKey, consumerSecret, null);  
  3.   
  4.           // Set the callback URL  
  5.           String thisUrl = request.getRequestURL().toString();  
  6.   String cbUrl = thisUrl.substring(0, thisUrl.lastIndexOf('/') + 1);  
  7.   if (redirSchema != null && redirSchema.equals(supportedRedirSchemas.EMBED.toString())) {  
  8.    cbUrl = cbUrl + callbackEmbedUrl;  
  9.   } else {  
  10.    cbUrl = cbUrl + callbackUrl;  
  11.   }  
  12.   oauthRequestor.setParameter("oauth_callback", cbUrl);  
  13.        
  14.           out.println("Request: " + oauthRequestor.encode());  
  15.           Map<string,string> reply = oauthRequestor.sendRequest();  
  16.           out.println("Reply: " + reply);  
  17.           requestToken = reply.get("oauth_token");  
  18.           session.setAttribute("requestToken", requestToken);  
  19. </string,string>  


ここで大事なのは
 com.evernote.oauth.consumer.SimpleOAuthRequest
クラスです。

コンストラクタではリクエストする為の引数を作っています。
その後、iframe埋め込みかを判定して、戻ってくるURLを変更しています。
サンプルを動作させるとわかりますがEMBEDを選んだ場合はiframeが出現して、
callback.jspが表示され、そのiframe上で認証をかけます。
なのでまぁその辺はあまり関係ないです。(OAuth後に呼び出すURLを変更するだけ)

sendRequest()によりrequestTokenUrlにリクエストして、RequestTokenを取得しにいっています。
戻り値のマップはResponseの値です。


その下で取得したRequestTokenでURLを作成しています。

  1. String authorizationUrl = authorizationUrlBase + "?oauth_token=" + requestToken;  
  2. if (redirSchema != null && redirSchema.equals(supportedRedirSchemas.EMBED.toString())) {  
  3.  authorizationUrl = authorizationUrl + "&format=microclip";  
  4. }  


埋め込みの場合は少しいじってますね。
このURL(Evernote)にアクセスする事で認可できるわけです。
このURLが2番目のURL。

JSPでまどろっこしいのですが、
基本的にはURL生成からリダイレクトすればいきなり認証も可能ですね。

そのURLにアクセスすれば



という風にEvernoteへの認可画面(認証済なのでこういう画面ですが認証してないとログイン画面)が出ます。

これに認可されると指定してあるCallbackUrlに処理がきます。

コールバックで戻ってくる最初の処理がこちら。

  1. requestToken = request.getParameter("oauth_token");  
  2. verifier = request.getParameter("oauth_verifier");  
  3. session.setAttribute("verifier", verifier);  


ちなみに「oauth_verifier」がnullの時は認可がされなかった時になります。
とにかくセッションに貯めてますね。。。このサンプル。
実際使う場合はコールバックURLでRequestTokenもverifierも取得して判定すれば良いでしょう。

で3番目のリンクをクリックすると

  1. // Send an OAuth message to the Provider asking to exchange the  
  2. // existing Request Token for an Access Token  
  3. SimpleOAuthRequest oauthRequestor =  
  4.   new SimpleOAuthRequest(requestTokenUrl, consumerKey, consumerSecret, null);  
  5. oauthRequestor.setParameter("oauth_token",  
  6.     (String)session.getAttribute("requestToken"));  
  7. oauthRequestor.setParameter("oauth_verifier",   
  8.     (String)session.getAttribute("verifier"));  
  9. out.println("Request: " + oauthRequestor.encode());  
  10. Map<string,string> reply = oauthRequestor.sendRequest();  
  11. out.println("Reply: " + reply);  
  12. accessToken = reply.get("oauth_token");  
  13. String shardId = reply.get("edam_shard");  
  14. session.setAttribute("accessToken", accessToken);  
  15. session.setAttribute("shardId", shardId);  
  16. tring>  


この処理を行っています。
再度SimpleOAuthRequestを利用してアクセストークンを取得しています。
・・・まぁセッションにまた貯めてますねぇ。。。

で最後にAPIにアクセスしています。

  1. String noteStoreUrl = noteStoreUrlBase +  
  2.   session.getAttribute("shardId");  
  3.   
  4. out.println("Listing notebooks from: " + noteStoreUrl);  
  5. THttpClient noteStoreTrans = new THttpClient(noteStoreUrl);  
  6. TBinaryProtocol noteStoreProt = new TBinaryProtocol(noteStoreTrans);  
  7. NoteStore.Client noteStore =  
  8.   new NoteStore.Client(noteStoreProt, noteStoreProt);  
  9. List<!----> notebooks = noteStore.listNotebooks(accessToken);  
  10.   
  11. for (Object notebook : notebooks) {  
  12.   out.println("Notebook: " + ((Notebook)notebook).getName());  
  13. }  


これによりノートブック一覧が取得できます。
ひとまずOAuthアクセスはこんな感じでできます。

SimpleOAuthRequestを読んでもらえればわかりますが、
パラメータを設定してアクセスしてあげてくれるだけです。

なのでOAuthの仕組みさえわかっていれば簡単です。
※サンプルは流れさえ押さえれば、わかるのですが
 JSPだけでアクセスしてるのでかなり複雑な書き方になっています。

OAuth1.0の解説で一番わかりやすいのはゆろよろ氏が記述している
OAuthプロトコルの中身をざっくり解説してみるよだと思います。
ご覧になってください。


さて今回はサンプルを元にやりましたので
次回Slim3を使ってアクセスしてみましょう!

0 件のコメント: