0

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 を使用した正しいアプローチかどうかはわかりません。

4

1 に答える 1