認証を別の Web アプリケーションでも処理する必要がある Play アプリケーションを作成しています。そのため、ユーザーが他の Web アプリケーションにログインするときは、Play アプリケーションにもログインする必要があります。
Play にセキュリティを実装するために、Play Framework のドキュメントの手順を使用しました: http://www.playframework.com/documentation/2.0.1/ScalaSecurity
外部認証を行う方法に関する私の考えは、他のアプリケーションに ajax 呼び出しを実行させて Play アプリケーションにログインさせることです。これにより、ユーザーのセッション Cookie が書き込まれると考えたからです。しかし、これはうまくいきません。Play アプリケーションにアクセスするときは、まだ手動でログインする必要があります。
これが私のコントローラーです:
val loginForm = Form(
tuple(
"username" -> nonEmptyText,
"password" -> nonEmptyText) verifying("Invalid email or password!", result => result match {
case (email, password) => Admin.authenticate(email, password)
}))
def jsLogin = Action {
implicit request => {
loginForm.bindFromRequest.fold(
formWithErrors => BadRequest(toJson("Unauthorized!")),
user => {
Ok(toJson("Ok")).withHeaders(
ACCESS_CONTROL_ALLOW_ORIGIN -> "*",
ACCESS_CONTROL_ALLOW_METHODS -> "POST",
ACCESS_CONTROL_MAX_AGE -> "300",
ACCESS_CONTROL_EXPOSE_HEADERS -> "Origin, X-Requested-With, Content-Type, Accept"
).withSession("email" -> user._1)
})
}
}
そして、これをテストするために使用したコードは次のとおりです。
$.ajax({
type: "POST",
url: "http://localhost:9000/jsLogin",
data: {
username: "username",
password: "password"
}
})
デバッグ後、jsLogin メソッドが正常に動作し、ユーザーがログインし、応答が ajax メソッドに正常に送信されることがわかりました。しかし、自分のプレイ アプリケーションにアクセスしようとすると、手動でログインするよう求められます。
ユーザーを外部からログインさせるための面倒ではない方法はありますか?