読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Pac4J をPlayframework2.2 に突っ込んでみて挫折(2013/11/01 時点で未対応)

Scala Playframework OSS

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 のプロトコル知らないと地獄かもしれませんが。