From sgcWebSockets 2022.1, the sgcWebSockets Pusher client allows to implement your own custom authentication.
Pusher staat abonneren op private- of presence-kanalen alleen toe als de verbinding een authenticatietoken meelevert, waardoor de toegang kan worden beperke access.
Je kunt je eigen authenticatie-flow bouwen met het OnPusherAuthentication-event; dit event wordt aangeroepen voordat het abonnementsbericht wordt ondertekend met de geheime sleutel die door Pusher is verstrekt. Dit event heeft 2 parameters: een request-authentication met velden zoals SocketId, kanaalnaam... die door je eigen authenticatieserver gebruikt kunnen worden om het verzoek wel of niet te authenticeren. Hieronder vind je een screenshot die de Pusher-authenticatie-flow toont
Pusher private subscription-flow

Delphi-voorbeeld
Wanneer een client verbinding maakt met de Pusher-server, stuurt deze de door Pusher verstrekte Key en geeft de server een identificatie-ID terug (socket_id).
Wanneer een client zich abonneert op een privaat (of presence) kanaal, gebruikt de sgcWebSockets-client de door Pusher verstrekte Secret Key om een handtekening aan te maken die in het abonnementsbericht wordt opgenomen. Met het OnPusherAuthentication-event kun je de velden vastleggen die nodig zijn om het bericht te ondertekenen, je eigen authenticatiemethoden implementeren en, indien succesvol, de handtekening teruggeven; deze handtekening wordt vervolgens in het abonnementsbericht opgenomen en naar de server verzonden.
oClient := TsgcWebSocketClient.Create(nil);
oPusher := TsgcWSAPI_Pusher.Create(nil);
oPusher.Client := oClient;
oPusher.Cluster := 'eu';
Pusher.Name := 'js';
Pusher.Version := '4.1';
Pusher.TLS := True;
Pusher.Key := '9c3b7ef25qe97a00116c';
Pusher.Secret := ''; // the secret key is not known by the client, only by the authentication module
oPusher.OnPusherAuthentication := OnPusherAuthenticationEvent;
procedure OnPusherAuthenticationEvent(Sender: TObject; AuthRequest: TsgcWSPusherRequestAuthentication; AuthResponse: TsgcWSPusherResponseAuthentication);
begin
// if the authentication request is succesful return the signature
if CustomAuthentication(AuthRequest.Channel, AuthRequest.SocketID) then
AuthResponse.Signature := GetCustomAuthenticationSignature;
end;
Het formaat van de handtekening is:
Private channels: key:HMAC256(SocketID, ChannelName)
Presence channels: key: HMAC256(SocketID, ChannelName, Data)
