This is what I ended up doing (code below). It just seems quite strange that the approach mentioned in the JWT documentation is not natively supported.
package modules
import com.mohiva.play.silhouette.api.services.AuthenticatorResult
import com.mohiva.play.silhouette.api.util.{Clock, IDGenerator}
import com.mohiva.play.silhouette.impl.authenticators.JWTAuthenticator._
import com.mohiva.play.silhouette.impl.authenticators.{JWTAuthenticator, JWTAuthenticatorService, JWTAuthenticatorSettings}
import play.api.mvc.{RequestHeader, Result}
import scala.concurrent.{ExecutionContext, Future}
class AuthHeaderJwtAuthenticatorService(
settings: JWTAuthenticatorSettings,
idGenerator: IDGenerator,
clock: Clock
)(implicit val execCtx: ExecutionContext) extends JWTAuthenticatorService(settings, None, idGenerator, clock)(execCtx) {
require(settings.headerName == "Authorization")
require(settings.authenticatorIdleTimeout.isEmpty)
override def retrieve(implicit request: RequestHeader): Future[Option[JWTAuthenticator]] = {
Future.successful {
request.headers.get("Authorization").flatMap { header =>
if (!header.startsWith("Bearer ") && !header.startsWith("bearer ")) None
else unserialize(header.substring(7))(settings).toOption
}
}
}
override def embed(token: String, result: Result)
(implicit request: RequestHeader): Future[AuthenticatorResult] = Future.successful(AuthenticatorResult(result))
override def embed(token: String, request: RequestHeader): RequestHeader = request
override def update(authenticator: JWTAuthenticator, result: Result)
(implicit request: RequestHeader): Future[AuthenticatorResult] = Future.successful(AuthenticatorResult(result))
}