Skip to content

Commit

Permalink
Merge pull request #10 from hmrc/to-stride-login
Browse files Browse the repository at this point in the history
HIPP-39: Stride Login
  • Loading branch information
PaulCDurham authored Jan 9, 2023
2 parents 3b58c20 + fd20a93 commit d14189b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 33 deletions.
19 changes: 12 additions & 7 deletions app/controllers/actions/IdentifierAction.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ import com.google.inject.Inject
import config.FrontendAppConfig
import controllers.routes
import models.requests.IdentifierRequest
import play.api.{Configuration, Environment}
import play.api.mvc.Results._
import play.api.mvc._
import uk.gov.hmrc.auth.core._
import uk.gov.hmrc.auth.core.retrieve.v2.Retrievals
import uk.gov.hmrc.http.{HeaderCarrier, UnauthorizedException}
import uk.gov.hmrc.play.bootstrap.config.AuthRedirects
import uk.gov.hmrc.play.http.HeaderCarrierConverter

import scala.concurrent.{ExecutionContext, Future}
Expand All @@ -33,22 +35,25 @@ trait IdentifierAction extends ActionBuilder[IdentifierRequest, AnyContent] with

class AuthenticatedIdentifierAction @Inject()(
override val authConnector: AuthConnector,
config: FrontendAppConfig,
val parser: BodyParsers.Default
configuration: FrontendAppConfig,
val parser: BodyParsers.Default,
override val config: Configuration,
override val env: Environment
)
(implicit val executionContext: ExecutionContext) extends IdentifierAction with AuthorisedFunctions {
(implicit val executionContext: ExecutionContext)
extends IdentifierAction with AuthorisedFunctions with AuthRedirects {

override def invokeBlock[A](request: Request[A], block: IdentifierRequest[A] => Future[Result]): Future[Result] = {

implicit val hc: HeaderCarrier = HeaderCarrierConverter.fromRequestAndSession(request, request.session)

authorised().retrieve(Retrievals.internalId) {
authorised().retrieve(Retrievals.credentials) {
_.map {
internalId => block(IdentifierRequest(request, internalId))
}.getOrElse(throw new UnauthorizedException("Unable to retrieve internal Id"))
credentials => block(IdentifierRequest(request, s"${credentials.providerType}-${credentials.providerId}"))
}.getOrElse(throw new UnauthorizedException("Unable to retrieve user credentials"))
} recover {
case _: NoActiveSession =>
Redirect(config.loginUrl, Map("continue" -> Seq(config.loginContinueUrl)))
toStrideLogin(configuration.loginContinueUrl)
case _: AuthorisationException =>
Redirect(routes.UnauthorisedController.onPageLoad)
}
Expand Down
56 changes: 30 additions & 26 deletions test/controllers/actions/AuthActionSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ package controllers.actions
import base.SpecBase
import com.google.inject.Inject
import config.FrontendAppConfig
import controllers.actions.AuthActionSpec.buildAuthenticatedIdentifierAction
import controllers.routes
import play.api.mvc.{BodyParsers, Results}
import play.api.{Application, Configuration, Environment}
import play.api.mvc.{Action, AnyContent, BodyParsers, Results}
import play.api.test.FakeRequest
import play.api.test.Helpers._
import uk.gov.hmrc.auth.core._
Expand All @@ -34,7 +36,7 @@ import scala.concurrent.{ExecutionContext, Future}
class AuthActionSpec extends SpecBase {

class Harness(authAction: IdentifierAction) {
def onPageLoad() = authAction { _ => Results.Ok }
def onPageLoad(): Action[AnyContent] = authAction { _ => Results.Ok }
}

"Auth Action" - {
Expand All @@ -48,13 +50,15 @@ class AuthActionSpec extends SpecBase {
running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]
val configuration = application.injector.instanceOf[Configuration]
val env = application.injector.instanceOf[Environment]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new MissingBearerToken), appConfig, bodyParsers)
val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new MissingBearerToken), appConfig, bodyParsers, configuration, env)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

status(result) mustBe SEE_OTHER
redirectLocation(result).value must startWith(appConfig.loginUrl)
redirectLocation(result).value must startWith("/stride/sign-in")
}
}
}
Expand All @@ -68,13 +72,15 @@ class AuthActionSpec extends SpecBase {
running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]
val configuration = application.injector.instanceOf[Configuration]
val env = application.injector.instanceOf[Environment]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new BearerTokenExpired), appConfig, bodyParsers)
val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new BearerTokenExpired), appConfig, bodyParsers, configuration, env)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

status(result) mustBe SEE_OTHER
redirectLocation(result).value must startWith(appConfig.loginUrl)
redirectLocation(result).value must startWith("/stride/sign-in")
}
}
}
Expand All @@ -86,10 +92,7 @@ class AuthActionSpec extends SpecBase {
val application = applicationBuilder(userAnswers = None).build()

running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new InsufficientEnrolments), appConfig, bodyParsers)
val authAction = buildAuthenticatedIdentifierAction(application)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

Expand All @@ -106,10 +109,7 @@ class AuthActionSpec extends SpecBase {
val application = applicationBuilder(userAnswers = None).build()

running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new InsufficientConfidenceLevel), appConfig, bodyParsers)
val authAction = buildAuthenticatedIdentifierAction(application)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

Expand All @@ -126,10 +126,7 @@ class AuthActionSpec extends SpecBase {
val application = applicationBuilder(userAnswers = None).build()

running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new UnsupportedAuthProvider), appConfig, bodyParsers)
val authAction = buildAuthenticatedIdentifierAction(application)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

Expand All @@ -146,10 +143,7 @@ class AuthActionSpec extends SpecBase {
val application = applicationBuilder(userAnswers = None).build()

running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new UnsupportedAffinityGroup), appConfig, bodyParsers)
val authAction = buildAuthenticatedIdentifierAction(application)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

Expand All @@ -166,10 +160,7 @@ class AuthActionSpec extends SpecBase {
val application = applicationBuilder(userAnswers = None).build()

running(application) {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]

val authAction = new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new UnsupportedCredentialRole), appConfig, bodyParsers)
val authAction = buildAuthenticatedIdentifierAction(application)
val controller = new Harness(authAction)
val result = controller.onPageLoad()(FakeRequest())

Expand All @@ -181,6 +172,19 @@ class AuthActionSpec extends SpecBase {
}
}

object AuthActionSpec {

def buildAuthenticatedIdentifierAction(application: Application): AuthenticatedIdentifierAction = {
val bodyParsers = application.injector.instanceOf[BodyParsers.Default]
val appConfig = application.injector.instanceOf[FrontendAppConfig]
val configuration = application.injector.instanceOf[Configuration]
val env = application.injector.instanceOf[Environment]

new AuthenticatedIdentifierAction(new FakeFailingAuthConnector(new UnsupportedCredentialRole), appConfig, bodyParsers, configuration, env)
}

}

class FakeFailingAuthConnector @Inject()(exceptionToReturn: Throwable) extends AuthConnector {
val serviceUrl: String = ""

Expand Down

0 comments on commit d14189b

Please sign in to comment.