aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Smith <zach@driver.xyz>2018-08-21 16:25:04 -0700
committerGitHub <noreply@github.com>2018-08-21 16:25:04 -0700
commit1f320bfba719d4cc3a4d46bc90a30d8a6bbd91d4 (patch)
tree156dfa050cd48f45918b31ea624a7aafc7ad8420
parent4e903b7bd19dd9daf7172ab06fe2e52b6b1fdb60 (diff)
downloaddriver-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
-rw-r--r--src/main/scala/xyz/driver/core/json.scala2
-rw-r--r--src/main/scala/xyz/driver/core/rest/DriverRoute.scala3
-rw-r--r--src/main/scala/xyz/driver/core/rest/auth/AuthProvider.scala5
-rw-r--r--src/main/scala/xyz/driver/core/rest/errors/serviceException.scala4
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)