Pusher 自定义身份验证

· 功能

sgcWebSockets 2022.1 起,sgcWebSockets Pusher 客户端支持实现自定义身份验证。

Pusher 仅允许在连接提供身份验证令牌的情况下订阅私有或存在频道,这可以限制访问权限。

您可以使用 OnPusherAuthentication 事件构建自己的身份验证流程。此事件在订阅消息被 Pusher 提供的密钥签名之前调用,包含 SocketId、频道名等请求认证字段,可由您自己的认证服务器决定是否通过请求。下方截图展示了 Pusher 身份验证流程。

Pusher 私有订阅流程 

Delphi 示例 

客户端连接到 Pusher 服务器时,会发送 Pusher 提供的 Key,服务器返回标识 ID(socket_id)。

当客户端订阅私有(或存在)频道时,sgcWebSockets 客户端使用 Pusher 提供的密钥创建签名并包含在订阅消息中。通过 OnPusherAuthentication 事件,您可以捕获签名所需字段,实现自己的认证逻辑,成功后返回签名,该签名将包含在订阅消息中发送给服务器。

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; 

签名格式如下:

私有频道:key:HMAC256(SocketID, ChannelName)

存在频道:key: HMAC256(SocketID, ChannelName, Data)