从 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)
