Playframework2.0でTwitterやFacebookのOAuth認証を簡単に扱えるplay-pac4jまとめ
pac4jとは
OAuthやOpenIDを利用した様々なウェブサービスの認証を簡単に行うためのライブラリで、TwitterやFacebookを始めとする14サービスへの認証を行うことが可能です。(2013年6月現在)
pac4jを利用することで、各サービスのプロトコルに依存せず、統一したコードを記述することができます。
playframeworkでの使い方
今回はplayframework2.0(java)上で、OAuthを使いFacebookからのユーザー情報を取得します。
Facebookの開発者登録を行いアプリケーションのkeyとsecretを予め取得してください。
1.必要なライブラリをconf/Build.scalaに追加する。
playframeworkの依存関係の解決についてはこちらを参照してください。
Playframework2.0でライブラリ依存関係を追加する方法 - 波打ち際のブログさん
pac4jのplay用ラッパーの play-pac4j_java と、今回はOAuth認証なので pac4j-oauth を conf/Build.scala に追加します。
val appDependencies = Seq( // Add your project dependencies here, javaCore, javaJdbc, javaEbean, "org.pac4j" % "play-pac4j_java" % "1.1.1-SNAPSHOT", //play用のpac4jラッパー "org.pac4j" % "pac4j-oauth" % "1.4.1-SNAPSHOT" //pac4jのOAuthライブラリ )
現在のリリースされている1.4.0はTwitterAPI1.0の廃止により、TwitterへのOAuth認証が使用できないため、今回はスナップショット版(1.4.1-SNAPSHOT)を利用しました。
また、スナップショット版を使用するため、pac4jのスナップショット用のリポジトリ設定を conf/Build.scala に追加します。
val main = play.Project(appName, appVersion, appDependencies).settings( // Add your own project settings here resolvers += "Sonatype snapshots repository" at "https://oss.sonatype.org/content/repositories/snapshots/" )
もし、スナップショット版を利用しない場合は下記のライブラリを利用します。
"org.pac4j" % "play-pac4j_java" % "1.1.0", "org.pac4j" % "pac4j-oauth" % "1.4.0"
2.Facebookクライアントの初期化を行う。
onStartメソッド内でFaceBookClientを初期化します。
onStartメソッドはplay起動時に呼び出されるメソッドです。
onStartをオーバーライドして、GlobalSettingsを継承したGlobalクラスをアプリケーションのパッケージルートに配置することで自動的に呼び出されます。
/* GlobalSettings, Logger, Application */ import play.*; import org.pac4j.core.client.Clients; import org.pac4j.oauth.client.FacebookClient; import org.pac4j.play.Config; public class Global extends GlobalSettings { @Override public void onStart(Application app) { /* ここでkeyとsecretを設定する。 */ final FacebookClient facebookClient = new FacebookClient("fb_key", "fb_secret"); final Clients clients = new Clients("http://localhost:9000/callback", facebookClient); Config.setClients(clients); } }
3.アクションメソッドを定義する
ログインURL発行用のアクション getUrl と、結果を受け取るアクション result をコントローラに追加します。
FacebookOAuthが、playのControllerではなく、pac4jのjavaControllerを継承している点に注意してください。
package controllers; import org.pac4j.play.java.JavaController; import org.pac4j.core.profile.CommonProfile; import play.mvc.Result; public class FacebookOAuth extends JavaController { public static Result result() { final CommonProfile profile = getUserProfile(); return ok(views.html.index.render(profile.toString())); } public static Result gerUrl() { final String url = getRedirectionUrl("FacebookClient", "/result"); return ok(views.html.index.render(url.toString())); } }
getRedirectionUrlメソッドで生成されたURLを、クライアントがクリックすることでFacebook認証のページに飛び、認証が終わると、指定されたURL(ここでは/result)に飛ばされます。
認証後はgetUserProfileメソッドでユーザーのプロファイルデータの取得ができます。
※viewの定義は適当にして下さい。
4.ルートを定義する
3.で追加したアクションメソッドと、pac4jのcallbackをconf/routesで定義します。
GET /result controllers.FacebookOAuth.result() GET /getUrl controllers.FacebookOAuth.gerUrl() GET /callback org.pac4j.play.CallbackController.callback() POST /callback org.pac4j.play.CallbackController.callback()
これだけでPlayframework2.0からOAuthでFacebook認証ができるようになりました。
Twitter等の他のサービスへの認証も同様の手順で行えます。詳細はpac4jの公式ドキュメントを参考にしてください。