Эквивалентно аутентифицированным маршрутам в akka-http? - PullRequest
0 голосов
/ 03 июня 2018

Это может быть немного странным вопросом, потому что я только начинаю с игры.Каков эквивалент аутентифицированных маршрутов, которые мы можем найти в akka-http?Ниже приведен пример аутентифицированного маршрута с использованием akka-http

def oauth2Authenticator(credentials: Credentials): Future[Option[ScalaFirebaseToken]] = {
    credentials match {
      case p @ Credentials.Provided(token) =>
          ImportFirebaseCredentials.decodeToken(token).flatMap {
            case token : FirebaseToken => {
              Future(Some(
                ScalaFirebaseToken(token.getUid,
                  Option(token.getEmail),
                  Option(token.getName),
                  Option(token.getPicture)
                )))
            }
            case _ => Future.successful(None)
          }
      case _ =>
        println("couldn't obtain credentials")
        Future.successful(None)
    }
  }

  def authenticated = authenticateOAuth2Async("auth", oauth2Authenticator)

  val route =
    path("user") {
      (get & authenticated) { authResult =>
        complete(getUserByUid(authResult.uid, authResult.email, authResult.name))
      }
    }

. Этот код получает учетные данные из заголовка запроса, проверяет его на основе firebase и затем возвращает данные для этого пользователя.

Я хотел бы получить пример того, как я должен аутентифицировать свои действия подобным образом.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Аутентифицированный маршрут может быть достигнут с использованием композиции действия .Вот один пример, взятый из playframework / play-scala-secure-session-example , который использует ActionBuilder для реализации аутентификации через UserInfoAction.invokeBlock:

override def invokeBlock[A](request: Request[A], block: (UserRequest[A]) => Future[Result]): Future[Result] = {
  // deal with the options first, then move to the futures
  val maybeFutureResult: Option[Future[Result]] = for {
    sessionId <- request.session.get(SESSION_ID)
    userInfoCookie <- request.cookies.get(USER_INFO_COOKIE_NAME)
  } yield {
    // Future can be flatmapped here and squished with a partial function
    sessionService.lookup(sessionId).flatMap {
      case Some(secretKey) =>
        val cookieBaker = factory.createCookieBaker(secretKey)
        val maybeUserInfo = cookieBaker.decodeFromCookie(Some(userInfoCookie))

        block(new UserRequest[A](request, maybeUserInfo, messagesApi))
      case None =>
        // We've got a user with a client session id, but no server-side state.
        // Let's redirect them back to the home page without any session cookie stuff.
        Future.successful {
          discardingSession {
            Redirect(routes.HomeController.index())
          }.flashing(FLASH_ERROR -> "Your session has expired!")
        }
    }
  }

  maybeFutureResult.getOrElse {
    block(new UserRequest[A](request, None, messagesApi))
  }
}

Если аутентификация завершается успешно, запрос обогащается maybeUserInfo, а если он не проходит, происходит перенаправление с Your session has expired, добавляемым во флэш-память.Теперь, чтобы добавить аутентификацию в маршрут, просто введите UserInfoAction в контроллер и назовите его примерно так:

def login = userAction.async { implicit request: UserRequest[AnyContent] =>
  ...
  // request.userInfo is now available
} 
0 голосов
/ 03 июня 2018

Не могу сказать по своему опыту, но это страница руководства об OAuth в Play!Framework:

https://www.playframework.com/documentation/2.6.x/ScalaOAuth#OAuth

Кроме того, список различных модулей, обеспечивающих функциональность аутентификации:

https://www.playframework.com/documentation/2.6.x/ModuleDirectory#Authentication-(Login-&-Registration)-and-Authorization-(Restricted-Access)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...