Pac4J をPlayframework2.2 に突っ込んでみて挫折(2013/11/01 時点で未対応)
Playframework2.2 になってから projects/Build.scala が抜けて、build.sbt に直接書くようになってるので注意。
っても、sbt 知ってればどうという事もない。
resolvers += "Sonatype snapshots repository" at "https://oss.sonatype.org/content/repositories/snapshots/" libraryDependencies ++= Seq( jdbc, anorm, cache, "org.pac4j" % "play-pac4j_java" % "1.1.2-SNAPSHOT", "org.pac4j" % "pac4j-oauth" % "1.4.2-SNAPSHOT" )
次に、Global.scala を作ってセットアップ
import org.pac4j.core.client.Clients import org.pac4j.oauth.client.FacebookClient import org.pac4j.play.Config import play.api._ object Global extends GlobalSettings { override def onStart(app: Application) { val facebookClient = new FacebookClient("XXXXXXXXXXXXXXX", "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ") val clients = new Clients("http://localhost:9000/callback", facebookClient) Config.setClients(clients) } }
そして、Controller 層
package controllers import play.api.mvc._ import org.pac4j.play.scala.ScalaController object Application extends ScalaController { def index = Action { request => val newSession = getOrCreateSessionId(request) val urlFacebook = getRedirectionUrl(request, newSession, "FacebookClient", "/facebook") // urlFacebook にリンクすればおk Ok(views.html.index(urlFacebook)).withSession(newSession) } def facebookIndex = RequiresAuthentication("FacebookClient") { profile => Action { request => // profile にログイン情報が詰まってる Ok(views.html.facebookIndex(profile)) } } }
最後に routes 弄ればおk
GET / controllers.Application.index GET /facebook controllers.Application.facebookIndex() GET /callback org.pac4j.play.CallbackController.callback() GET /logout org.pac4j.play.CallbackController.logoutAndRedirect()
で、いざ起動すると、、、、動きません。
原因的には CallbackController の最後で redirect しようとして「そんなメソッドねーよ!」つって落ちてる。
Play2.1 -> 2.2 でこの辺の仕様が変わったらしい。マイナーバージョンでAPI仕様が変わるところはPlayらしいっちゃらしい。
ちょっと調べたら速攻原因発見
https://github.com/leleuj/play-pac4j/issues/12
2か月位放置されてるようなので、正直期待は薄いか、、、。
Play 組み込み以外の Pac4J を直で使ってどうにかしたほうがよさそう?
その際 OAuth2 のプロトコル知らないと地獄かもしれませんが。