2016-12-19 2 views
2

Я пытаюсь преобразовать свои маршруты распыления в akka http.scala akka http route с аутентификацией токеном

Это очень сложно для новичков, но я почти все делаю. Я моюсь аутентификацией.

Действительно, у меня есть маршрут с ключом get param = ???? Как я могу проверить этот токен с помощью akka? Мой маршрут:

val route : Route = { 
    path("appActive") { 
      get { 
       parameters('date_end.as[Long]) { 
        date_end => 
         onSuccess(requestHandler ? AppActiveGetList(AppActiveRequest(date_end, null, 0))) { 
          case response: Answer => 
           complete(StatusCodes.OK, response.result) 
          case _ => 
           complete(StatusCodes.InternalServerError, "Error on the page") 
         } 
       } 
     } 
    } 
} 

Моя функция Аутентифицировать на данный момент (с распылителем):

trait TokenValidator { 
def validateTokenApp(): ContextAuthenticator[InfoApp] = { 
    ctx => 
     val access_token = ctx.request.uri.query.get("access_token") 
     if (access_token.isDefined) { 
      doAuthApp(access_token.get) 
     } else { 
      Future(Left(AuthenticationFailedRejection(AuthenticationFailedRejection.CredentialsMissing, List()))) 
     } 
} 
} 

Я Ждут т найти пример я могу использовать легко. Не могли бы вы мне помочь?

+0

Вы просто пытаетесь переписать 'validateTokenApp()' с AKKA HTTP? –

ответ

3

Похоже, что директивы аутентификации Akka-HTTP более строгие в ожидании, чем в случае спрей. Если вы хотите сохранить свой doAuthApp без изменений, вам нужно будет определить свою собственную настраиваемую директиву - по строкам собственного телефона authenticateOrRejectWithChallenge Akka-HTTP.

def doAuthApp[T](token: String): Future[AuthenticationResult[T]] = ??? 

    def authenticated[T](authenticator: String => Future[AuthenticationResult[T]]): AuthenticationDirective[T] = 
    parameter('access_token.?).flatMap { 
     case Some(token) => 
     onSuccess(authenticator(token)).flatMap { 
      case Right(s) => provide(s) 
      case Left(challenge) => 
      reject(AuthenticationFailedRejection(CredentialsRejected, challenge)): Directive1[T] 
     } 
     case None => 
     reject(AuthenticationFailedRejection(CredentialsMissing, HttpChallenges.oAuth2("my_realm"))): Directive1[T] 
    } 

А потом провод маршрут где-то, как

val route : Route = { 
    path("appActive") { 
     (get & authenticated(doAuthApp)){ authResult => 
     parameters('date_end.as[Long]) { 
      date_end => 
      ... 
     } 
     } 
    } 
    } 
+0

Это хорошо работает, но не могли бы вы объяснить мне, что такое «my_realm», пожалуйста? –

+0

Это необязательный параметр, описанный в https://tools.ietf.org/html/rfc6750 и https://tools.ietf.org/html/rfc2617. В Spray вы можете вообще не указывать никаких проблем при отказе с помощью 'AuthenticationFailedRejection', в то время как Akka-HTTP еще более строг. Обратите внимание, что область необязательна, и вы также можете отклонить с помощью функции 'reject (AuthenticationFailedRejection (CredentialsMissing, HttpChallenge (« OAuth2 », None)): Directive1 [T]' –

+0

realm - это строка, а не опция [String], поэтому я не знаю, Думаю, вы можете передать «Нет», –

Смежные вопросы