Так работает базовая аутентификация в Akka HTTP:
Заголовок Authorization
в HTTP-запросе используется для базовой аутентификации и содержит имя пользователя и пароль, закодированные с использованием кодировки base64
. Маршрут authenticateBasic
извлечет эту информацию из заголовка для создания объекта Credentials
, а затем передаст ее в метод myUserPassAuthenticator
. Этот метод должен проверить, что имя пользователя и пароль совпадают, и в случае успеха он должен вернуть объект, представляющий этого пользователя в вашей системе, или вернуть None
при ошибке.
Второй (карри) аргумент authenticateBasic
- это функция, которая принимает пользовательские данные и возвращает Route
. Таким образом, в вашем случае аргумент email
будет содержать значение id
, возвращаемое myUserPassAuthenticator
. Эта функция должна возвращать маршрут, который содержит все пути, требующие аутентификации.
Важно понимать, что не существует концепции "входа в систему" с базовой аутентификацией. Есть только учетные данные, которые являются правильными или неправильными. (Если вы хотите иметь семантику входа / выхода, вам нужно перейти к механизму аутентификации на основе токенов).
Итак, чтобы заставить ваши маршруты работать, вам нужно переместить логику, которая ищет идентификатор пользователя в myUserPassAuthenticator
и вернуть в результате объект user
. Как это бывает, вы можете просто вернуть результат find
, потому что это уже возвращает Option[User]
.
Вам также необходимо убедиться, что все аутентифицированные маршруты находятся внутри маршрута authenticateBasic
. В настоящее время маршруты basketActor
и add
находятся на одном уровне и, следовательно, не проходят проверку подлинности.
Примерный маршрут будет выглядеть следующим образом. Я использовал concat
, а не ~
, так как я думаю, что это понятнее.
pathPrefix("secured") {
authenticateBasic(realm = "secure site", myUserPassAuthenticator) { user =>
concat(
(pathEnd | pathSingleSlash) {
get {
complete(s"User $user Authenticated OK")
}
},
path("basketActor") {
(pathEnd & get) {
complete(s"basketActor for $user")
}
},
path("add" / IntNumber) { number =>
post {
complete(s"User $user posted $number")
}
}
)
}
}
Обратите внимание, что идентификатор пользователя (адрес электронной почты) отсутствует в URL-адресе, он указан в запросе в заголовке Basic Authentication
.
Чтобы проверить это с почтальоном, вам нужно создать GET
с URL .../secured
или .../secured/basketActor
, или POST
с URL .../secured/add/1
. На вкладке Auth
необходимо выбрать Basic Authentication
и добавить туда учетные данные.