Подтвердить что ты не робот

Как сделать аутентификацию с помощью Akka HTTP

Ищите хорошее объяснение того, как сделать аутентификацию с помощью akka HTTP. Учитывая маршрут, который выглядит как

val route = 
  path("account") {
    authenticateBasic(realm = "some realm", myAuthenticator) { user =>
      get {
        encodeResponseWith(Deflate) {
          complete {
            //do something here
          }
        }
      }
    }
  }

В документации описывается способ, но затем соответствующая часть, выполняющая фактическую проверку подлинности, опущена...

// backend entry points
def myAuthenticator: Authenticator[User] = ???

Где я могу найти пример реализации такого аутентификатора? У меня есть логика для аутентификации пользователя с именем пользователя и паролем, но я не могу понять, как получить имя пользователя/пароль (или токен, содержащий оба) из HTTP-запроса (или RequestContext).

4b9b3361

Ответ 1

Аутентификатор - это просто функция UserCredentials => Option[T], где UserCredentials в случае наличия (проверьте с помощью сопоставления с образцом) Provided имеет метод verifySecret(secret), который вам необходимо безопасно вызывать и возвращать Some (некоторые пользователи, например) в случае успеха, например:

def myAuthenticator: Authenticator[User] = {
  case [email protected](username) =>
    if(p.verifySecret(myGetSecret(username))) Some(username) else None
  case Missing => None //you can throw an exeption here to get customized response otherwise it will be regular `CredentialsMissing` message

}   

myGetSecret - это ваша пользовательская функция, которая получает имя пользователя и возвращает ваш секрет (например, пароль), получая его, возможно, из базы данных. verifySecret будет безопасно сравнивать (чтобы избежать временной атаки) предоставил пароль с паролем от myGetSecret. Как правило, "секрет" - это любая скрытая информация (например, хэш учетных данных или токен), но в случае базовой аутентификации это просто простой пароль, извлеченный из заголовков http.

Если вам нужен более индивидуальный подход - используйте authenticateOrRejectWithChallenge, который получает HttpCredentials в качестве ввода, поэтому вы можете извлечь из него предоставленный пароль.

Подробнее о авторизации в scaladocs.