波打際のブログさん

主に、プログラミング備忘録など。

Playframework2.0でTwitterやFacebookのOAuth認証を簡単に扱えるplay-pac4jまとめ

pac4jとは

OAuthやOpenIDを利用した様々なウェブサービスの認証を簡単に行うためのライブラリで、TwitterFacebookを始めとする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の公式ドキュメントを参考にしてください。