Auth0 отделен на стороне клиента / на стороне сервера

0

Я разрабатываю приложение, которое имеет серверную часть, используя 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/...

Теги:
playframework
auth0

2 ответа

0
Лучший ответ

Итак, спасибо @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 со своей клиентской стороны!

1

Вы можете отобразить его на стороне клиента:

Ok
  .sendFile(content = new File("./public/layout.html"), inline = true).as("text/html")
  .withSession(session)

или .withCookies(cookie)

  • 0
    Итак, я попробовал оба ваших варианта, с первым, который я все еще не нахожу в Angular, когда я делаю $ cookies.getAll (), для withCookies я получаю исключение для выполнения. Значение Cookie содержит недопустимый символ: ". WithSession кажется хорошим решением, но где оно хранится?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню