我正在編寫一個Play應用程序,我需要將身份驗證也由另一個Web應用程序處理。所以,當用戶登錄到其他Web應用程序時,它也應該登錄到Play應用程序。在Play 2.1中使用ajax進行身份驗證
爲了實現在播放安全我用的播放框架文檔中的說明: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方法。但是當我嘗試訪問我的播放應用程序時,它仍然要求我手動登錄。
是否有一些非外掛方式讓用戶從外部登錄?
其實,我認爲我的問題是跨域cookies。我的Play應用程序在本地主機上運行,另一個帶有ajax登錄的Web應用程序在0.0.0.0上運行。這是在這個帖子上更多的討論:http://stackoverflow.com/questions/3342140/cross-domain-cookies我仍然需要測試在同一個域上運行這個,但如果它的工作,我會更新帖子。 – Klaus