Autenticação Personalizada no Pusher

· Recursos

A partir do sgcWebSockets 2022.1, o cliente Pusher do sgcWebSockets permite implementar sua própria autenticação personalizada.

O Pusher só permite assinar canais privados ou de presença se a conexão fornecer um token de autenticação, o que permite restringir o acesso.

Você pode criar seu próprio fluxo de autenticação usando o evento OnPusherAuthentication. Esse evento é chamado antes de a mensagem de subscrição ser assinada com a chave secreta fornecida pelo Pusher. O evento tem 2 parâmetros: uma requisição de autenticação com campos como SocketId, nome do canal... que podem ser usados pelo seu próprio servidor de autenticação para autenticar ou não a requisição. Veja abaixo uma imagem que mostra o fluxo de autenticação do Pusher.

Fluxo de Subscrição Privada do Pusher 

Exemplo em Delphi 

Quando um cliente se conecta ao servidor Pusher, ele envia a Key fornecida pelo Pusher e o servidor retorna um id de identificação (socket_id).

Quando um cliente assina um canal privado (ou de presença), o cliente sgcWebSockets usa a Secret Key fornecida pelo Pusher para criar uma assinatura que é incluída na mensagem de subscrição. Usando o evento OnPusherAuthentication, você pode capturar os campos necessários para assinar a mensagem, implementar seus próprios métodos de autenticação e, se bem-sucedido, retornar a assinatura, que será incluída na mensagem de subscrição e enviada ao 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; 

O formato da assinatura é:

Canais privados: key:HMAC256(SocketID, ChannelName)

Canais de presença: key: HMAC256(SocketID, ChannelName, Data)