通过令牌

时间:2016-12-19 16:21:58

标签: scala akka akka-http

我试图在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())))
        }
}
}

我没有找到一个可以轻松使用的例子。 你能帮帮我吗?

1 个答案:

答案 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 =>
            ...
        }
      }
    }
  }