Autenticación personalizada en Pusher

· Características

Desde sgcWebSockets 2022.1, el cliente Pusher de sgcWebSockets permite implementar tu propia autenticación personalizada.

Pusher solo permite suscribirse a canales privados o de presencia si la conexión proporciona un token de autenticación, lo que permite restringir el acceso.

Puedes construir tu propio flujo de autenticación usando el evento OnPusherAuthentication; este evento se llama antes de que el mensaje de suscripción sea firmado con la secret key proporcionada por Pusher. Este evento tiene 2 parámetros: una petición de autenticación con campos como SocketId, nombre del canal... que pueden ser usados por tu propio servidor de autenticación para autenticar o no la petición. A continuación encontrarás una captura que muestra el flujo de autenticación de Pusher

Flujo de suscripción privada en Pusher 

Ejemplo en Delphi 

Cuando un cliente se conecta al servidor de Pusher, envía la Key proporcionada por Pusher y el servidor devuelve un id de identificación (socket_id).

Cuando un cliente se suscribe a un canal privado (o de presencia), el cliente sgcWebSockets usa la Secret Key proporcionada por Pusher para crear una firma que se incluye en el mensaje de suscripción. Usando el evento OnPusherAuthentication puedes capturar los campos necesarios para firmar el mensaje, implementar tus propios métodos de autenticación y, si tiene éxito, devolver la firma; esta firma se incluirá en el mensaje de suscripción y se enviará al servidor.

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; 

El formato de la firma es:

Canales privados: key:HMAC256(SocketID, ChannelName)

Canales de presencia: key: HMAC256(SocketID, ChannelName, Data)