I had the same issue trying to replicate client-side authentication that I had working in Silhouette 3.x on Play 2.4
Since I am not passing back any state from the client, I created a DummySocialStateHandler
that did not require a Signer
class DummySocialStateHandler(override val handlers: Set[SocialStateItemHandler])
extends SocialStateHandler {
override type Self = DummySocialStateHandler
override def withHandler(handler: SocialStateItemHandler): DummySocialStateHandler = {
new DummySocialStateHandler(handlers + handler)
}
override def state(implicit ec: ExecutionContext): Future[SocialState] = {
Future.sequence(handlers.map(_.item)).map(items => SocialState(items.toSet))
}
override def unserialize[B](state: String)(
implicit
request: ExtractableRequest[B],
ec: ExecutionContext
): Future[SocialState] = {
Future.successful(SocialState(Set()))
}
override def serialize(state: SocialState): String = ""
override def publish[B](result: Result, state: SocialState)(implicit request: ExtractableRequest[B]): Result = {
handlers.collect { case h: PublishableSocialStateItemHandler => h }.foldLeft(result) { (r, handler) =>
state.items.foldLeft(r) { (r, item) =>
handler.canHandle(item).map(item => handler.publish(item, r)).getOrElse(result)
}
}
}
}
In my SilhouetteModule
, I created a provider for the DummySocialStateHandler
@Provides
def provideSocialStateHandler(): SocialStateHandler = {
new DummySocialStateHandler(Set())
}
This seemed to resolve this issue. However, a potentially better solution would be to have DefaultSocialStateProvider determine if the State
is set first before attempting to extract (SocialStateProvider.scala:269
).