Pusher Custom Authentication

· Funktionen

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)