app/controllers/Login.scala (37 lines of code) (raw):

package controllers import com.gu.pandomainauth.PanDomainAuthSettingsRefresher import config.LoginConfig import play.api.mvc._ class Login( deps: LoginControllerComponents, panDomainSettings: PanDomainAuthSettingsRefresher ) extends LoginController(deps, panDomainSettings) { private val defaultAllowHeaders = List("X-Requested-With","Origin","Accept","Content-Type") def oauthCallback = Action.async { implicit request => processOAuthCallback() } def status = AuthAction { request => val user = request.user Ok(views.html.loginStatus(user.toJson)) } def logout = Action { implicit request => processLogout } def whoami = APIAuthAction { implicit request => val user = request.user cors(Ok(user.toJson).as("application/json"), Some("GET")) } private def cors(result: Result, allowedMethods: Option[String] = None)(implicit request: RequestHeader): Result = { val responseHeaders = (defaultAllowHeaders ++ request.headers.get("Access-Control-Request-Headers").toList) mkString "," request.headers.get("Origin") match { case None => result case Some(requestOrigin) if LoginConfig.isValidUrl(config.domain, requestOrigin) => { val headers = allowedMethods.map("Access-Control-Allow-Methods" -> _).toList ++ List( "Access-Control-Allow-Origin" -> requestOrigin, "Access-Control-Allow-Headers" -> responseHeaders, "Access-Control-Allow-Credentials" -> "true") result.withHeaders(headers: _*) } case Some(requestOrigin) => Unauthorized } } }