object AuthenticationUtils {
def generateUserRequest(implicit system: ActorSystem, executionContext: ExecutionContext): Directive1[UserRequest] = {
optionalHeaderValueByName("Authorization").flatMap {
case Some(tokenValue) if Token.isValidTokenHeader(tokenValue) =>
val token = Token.fromHeader(tokenValue).get
val selection = system.actorSelection("myauthenticator-actor-selection-here")
implicit val timeout: Timeout = Timeout(2 minutes) //may be implicit timeout?
val future = (selection ? RedisTokenActor.GenerateUserRequest(token)).mapTo[GenerateUserRequestResponse]
.map { r => r.optUserRequest}
/*onSuccess(future) { //this does not work.
case Some(ur) => provide(ur)
case _ => reject(AuthorizationFailedRejection)
}*/
val res = Await.result(future, timeout.duration) //todo: make this async.
res match {
case Some(ur) => provide(ur)
case _ => reject(AuthorizationFailedRejection)
}
case _ => reject(AuthorizationFailedRejection)
}
}
}
Also faced such a problem:
def withActiveAuth: Directive1[Session] = {
optionalHeaderValueByName("session") {
case Some(session) =>
val s = Session(session)
onSuccess(sessionRepository.validateSession(s)) { result =>
if (result) {
provide(s) <------ ERROR
} else {
reject(MalformedHeaderRejection("session", "This session is not active"))
}
}
case None =>
reject(MissingHeaderRejection("session"))
}
}
Error:(18, 22) type mismatch; found : akka.http.scaladsl.server.Directive1[wtf.scala.coursetest.Session] (which expands to) akka.http.scaladsl.server.Directive[(wtf.scala.coursetest.Session,)] required: akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult] provide(s)
def withActiveSession: Directive1[Session] = {
optionalHeaderValueByName("session").flatMap {
case Some(session) =>
val s = Session(session)
onSuccess(sessionRepository.validateSession(s)).flatMap { result =>
if (result) {
provide(s)
} else {
reject(MalformedHeaderRejection("session", "This session is not active"))
}
}
case None =>
reject(MissingHeaderRejection("session"))
}
}