Я разрабатываю приложение, которое имеет серверную часть, используя Play Framework Scala и клиентскую сторону AngularJS.
Я хочу управлять аутентификацией только на стороне сервера, потому что мне нужно будет защитить как API, так и приложение, и я хочу, чтобы сеансы были "централизованы" на моем сервере.
Но поскольку я не использую шаблоны просмотра Play Framework (чтобы моя сторона на стороне клиента и моя независимая сторона сервера), я не могу передавать информацию профиля пользователя на клиентскую сторону, как это сделано в примерах.
Я попытался перечислить свой кеш и мои ключи Cookie на моем угловом шаблоне, но я не могу найти ничего там.
Есть ли способ захватить информацию о сеансе с помощью Angular? с запросом сессии и управлением Play Framework? (Я не могу найти его нигде в документах)
Вот как я делаю свою первую страницу с лицевой стороны с угловым клиентом (для платформы Play только маршрутизация API и эта маршрутизация на первой странице)
def frontPage() = AuthenticatedAction {
request =>
val idToken = request.session.get("idToken").get
val profile = cache.get[JsValue](idToken + "profile").get
Ok.sendFile(content = new File("./public/layout.html"), inline = true).as("text/html")
}
Вот как это делается на примере документов:
def index = AuthenticatedAction { request =>
val idToken = request.session.get("idToken").get
val profile = Cache.getAs[JsValue](idToken + "profile").get
Ok(views.html.user(profile))
}
Мне нужно было бы получить этот "профиль" в моем шаблоне, но я не хочу иметь шаблоны scala html: я хочу продолжать использовать чистые угловые шаблоны, чтобы поддерживать независимость сторон клиент/сервер (только для общения через API)
EDIT 21/06/2016: я не нашел способ захватить информацию о сеансе непосредственно из Angular, но я смог вернуть его, расширив API, и мне нравится это решение лучше! см. qaru.site/questions/12099248/...
Итак, спасибо @Simon за то, что указали мне в правильном направлении.
Теперь я отправляю сеанс после входа в систему:
Ok.sendFile(content = new File("./public/layout.html"), inline = true).as("text/html").withSession("connected" -> profile.toString())
Мне не удалось получить сеанс непосредственно из Angular, поэтому вместо этого я обновил свой API, чтобы получить действие, возвращающее информацию о сеансе:
def getSession = Action { request =>
request.session.get("connected").map {
user => Ok(Json.parse(user))
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
(в маршрутах:
## USER SESSION
GET /api/session controllers.Callback.getSession
)
Таким образом, я могу вызвать API для получения информации о сеансе на моей стороне клиента, возможно, это Angular, мобильное приложение или любое приложение, которое читает JSON.
Пример возврата JSON:
{"email":"[email protected]","email_verified":false,"clientID":"MvM2wHRX2rMKp5s3UXXXXXXXX","updated_at":"2016-06-21T10:59:49.730Z","picture":"https://s.gravatar.com/avatar/e91d5ae3XXXXXXXXXXX?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fda.png","user_id":"auth0|5XXXXXXXXX47b1b07d","name":"[email protected]","nickname":"XXX","identities":[{"user_id":"5767bea338XXXXXX","provider":"auth0","connection":"Username-Password-Authentication","isSocial":false}],"created_at":"2016-06-20T10:00:03.921Z","sub":"auth0|5767beXXXXXXX"}
Я надеюсь, что это поможет любому, кто пытается развязать серверную платформу Play Framework со своей клиентской стороны!
Вы можете отобразить его на стороне клиента:
Ok
.sendFile(content = new File("./public/layout.html"), inline = true).as("text/html")
.withSession(session)
или .withCookies(cookie)