Ab sgcWebSockets 2022.1 kannst du im sgcWebSockets-Pusher-Client eine eigene Custom Authentication implementieren.
Pusher erlaubt Subscriptions auf Private- oder Presence-Channels nur, wenn die Verbindung ein Authentifizierungs-Token liefert – damit lässt sich der Zugriff beschränken.
Du kannst über das Ereignis OnPusherAuthentication einen eigenen Authentifizierungs-Flow aufbauen. Dieses Ereignis wird aufgerufen, bevor die Subscription-Nachricht mit dem von Pusher bereitgestellten Secret Key signiert wird. Das Ereignis hat 2 Parameter: einen Authentifizierungs-Request mit Feldern wie SocketId, Channel-Name ..., die dein eigener Authentifizierungs-Server zur Annahme oder Ablehnung der Anfrage nutzen kann. Unten findest du einen Screenshot, der den Pusher-Authentifizierungs-Flow zeigt
Pusher-Private-Subscription-Flow

Delphi-Beispiel
Wenn ein Client sich mit dem Pusher-Server verbindet, sendet er den von Pusher bereitgestellten Key, und der Server gibt eine Identifikations-ID (socket_id) zurück.
Wenn ein Client einen Private- (oder Presence-) Channel abonniert, verwendet der sgcWebSockets-Client den von Pusher bereitgestellten Secret Key, um eine Signatur zu erzeugen, die in der Subscription-Nachricht enthalten ist. Mit dem Ereignis OnPusherAutentication kannst du die zum Signieren benötigten Felder abgreifen, deine eigenen Authentifizierungsmethoden implementieren und – bei Erfolg – die Signatur zurückgeben. Diese Signatur wird in die Subscription-Nachricht eingebettet und an den Server gesendet.
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;
Die Signatur hat folgendes Format:
Private Channels: key:HMAC256(SocketID, ChannelName)
Presence Channels: key: HMAC256(SocketID, ChannelName, Data)
