diff options
author | Zach Smith <zach@driver.xyz> | 2018-08-21 16:25:04 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-21 16:25:04 -0700 |
commit | 1f320bfba719d4cc3a4d46bc90a30d8a6bbd91d4 (patch) | |
tree | 156dfa050cd48f45918b31ea624a7aafc7ad8420 /src/main/scala/xyz | |
parent | 4e903b7bd19dd9daf7172ab06fe2e52b6b1fdb60 (diff) | |
download | driver-core-1f320bfba719d4cc3a4d46bc90a30d8a6bbd91d4.tar.gz driver-core-1f320bfba719d4cc3a4d46bc90a30d8a6bbd91d4.tar.bz2 driver-core-1f320bfba719d4cc3a4d46bc90a30d8a6bbd91d4.zip |
Add UnauthorizedException and catch it in AuthProvider (#198)
* Add AuthorizationException and pass it through in authorize directive
* Move recover to authenticator method
Diffstat (limited to 'src/main/scala/xyz')
4 files changed, 13 insertions, 1 deletions
diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index e4a0cef..639af22 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -390,6 +390,7 @@ object json { GadtJsonFormat.create[ServiceException]("type") { case _: InvalidInputException => "InvalidInputException" case _: InvalidActionException => "InvalidActionException" + case _: UnauthorizedException => "UnauthorizedException" case _: ResourceNotFoundException => "ResourceNotFoundException" case _: ExternalServiceException => "ExternalServiceException" case _: ExternalServiceTimeoutException => "ExternalServiceTimeoutException" @@ -397,6 +398,7 @@ object json { } { case "InvalidInputException" => jsonFormat(InvalidInputException, "message") case "InvalidActionException" => jsonFormat(InvalidActionException, "message") + case "UnauthorizedException" => jsonFormat(UnauthorizedException, "message") case "ResourceNotFoundException" => jsonFormat(ResourceNotFoundException, "message") case "ExternalServiceException" => jsonFormat(ExternalServiceException, "serviceName", "serviceMessage", "serviceException") diff --git a/src/main/scala/xyz/driver/core/rest/DriverRoute.scala b/src/main/scala/xyz/driver/core/rest/DriverRoute.scala index 55f39ba..288245a 100644 --- a/src/main/scala/xyz/driver/core/rest/DriverRoute.scala +++ b/src/main/scala/xyz/driver/core/rest/DriverRoute.scala @@ -79,6 +79,9 @@ trait DriverRoute { case e: InvalidActionException => log.info("Invalid client action error", e) StatusCodes.Forbidden + case e: UnauthorizedException => + log.info("Unauthorized user error", e) + StatusCodes.Unauthorized case e: ResourceNotFoundException => log.info("Resource not found error", e) StatusCodes.NotFound diff --git a/src/main/scala/xyz/driver/core/rest/auth/AuthProvider.scala b/src/main/scala/xyz/driver/core/rest/auth/AuthProvider.scala index 1fddd45..e1a94e1 100644 --- a/src/main/scala/xyz/driver/core/rest/auth/AuthProvider.scala +++ b/src/main/scala/xyz/driver/core/rest/auth/AuthProvider.scala @@ -4,6 +4,7 @@ import akka.http.scaladsl.server.directives.Credentials import com.typesafe.scalalogging.Logger import scalaz.OptionT import xyz.driver.core.auth.{AuthToken, Permission, User} +import xyz.driver.core.rest.errors.{ExternalServiceException, UnauthorizedException} import xyz.driver.core.rest.{AuthorizedServiceRequestContext, ContextHeaders, ServiceRequestContext, serviceContext} import scala.concurrent.{ExecutionContext, Future} @@ -34,7 +35,9 @@ abstract class AuthProvider[U <: User]( log.info(s"Request (${context.trackingId}) missing authentication credentials") Future.successful(None) case Credentials.Provided(authToken) => - authenticatedUser(context.withAuthToken(AuthToken(authToken))).run + authenticatedUser(context.withAuthToken(AuthToken(authToken))).run.recover({ + case ExternalServiceException(_, _, Some(UnauthorizedException(_))) => None + }) } /** diff --git a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala index db289de..f2962c9 100644 --- a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala +++ b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala @@ -7,6 +7,10 @@ final case class InvalidInputException(override val message: String = "Invalid i final case class InvalidActionException(override val message: String = "This action is not allowed") extends ServiceException(message) +final case class UnauthorizedException( + override val message: String = "The user's authentication credentials are invalid or missing") + extends ServiceException(message) + final case class ResourceNotFoundException(override val message: String = "Resource not found") extends ServiceException(message) |