This was an interesting one for me. It took me quite a while to clearly get the private subscriptions. Here is what it was in the end:
AuthenticationSuccessListener
public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event): void { $data = $event->getData(); $user = $event->getUser(); if (!$user instanceof User) { return; } $token = (new Builder()) ->withClaim('mercure', ['subscribe' => $user->getMercureIri()]) ->sign(new Sha256(), 'my_secret_key') ->getToken(); $data['mercureToken'] = $token->__toString(); $event->setData($data); }
User Entity
public function getMercureIri(): array
{
return ['api/users/'.$this->getId()];
}
Remember you need to register the listener in your services.yml but thats about it! Now when you login, you get a Mercure Token which you save, and when you try to subscribe from front end, pass that token… and there it is.
NOTE:
I wasted a few hours because I forgot to destroy the old token on logout, so other users were using the token. Don’t forget to destroy token 🙂