У меня есть маршруты без проверки подлинности и маршруты с проверкой подлинности в моем Akka/Spray DSL. Ниже приведен упрощенный вариант кода
val nakedRoutes = pathPrefix("user") {
post {
entity(as[UserNew]) { user =>
(validate(EmailValidator.getInstance().isValid(user.email), s"Invalid email address ${user.email}") & validate(!user.password.isEmpty, "Password should not be empty")) {
complete {
UserWire(new ObjectId(), user.firstName, user.lastName, user.email, user.company, user.role, new ObjectId())
}
}
}
}
}
val myAuthorization: Directive[Tuple1[String]] = (headerValueByName("X-API-Token") | parameter("token")).tflatMap[Tuple1[String]]{
case Tuple1(token) => if (!token.isEmpty) provide(token.reverse) else complete(StatusCodes.Forbidden -> "API token is not provided")
}
val authenticatedRoutes = myAuthorization { user =>
get { complete { "" } }
}
val routes = (decodeRequest & encodeResponse) {
authenticatedRoutes ~ nakedRoutes
}
Идея состоит в том, что пользователь делает POST /user
запрос, получает токен и использует его для аутентифицированных маршрутов.
У меня проблема в том, что при сбое проверки электронной почты я получаю неправильный отказ
Request is missing required HTTP header 'X-API-Token'
Почему он не выдает последний отказ? Как он выбирает, какое отклонение вернуть клиенту?
Я, вероятно, могу проверить электронную почту вручную с помощью if-else
и вернуть пользовательский complete{}
, но я не уверен, что это правильный подход с akka-http.