我试图在akka http中转换我的喷雾路线。
新手真的很复杂,但我几乎做了一切。 我通过身份验证了。
确实,我有一个带有参数令牌的路线= ???? 我怎样才能用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 :(得分:4)
看起来Akka-HTTP身份验证指令比Spray更严格。
如果您想保持doAuthApp
不变,则需要定义自己的自定义指令 - 与Akka-HTTP自己的authenticateOrRejectWithChallenge一致。
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 =>
...
}
}
}
}