【问题标题】:Pusher Client Error: Invalid SignaturePusher 客户端错误:签名无效
【发布时间】:2025-12-05 01:10:01
【问题描述】:

我最近查看了我的推送错误日志并注意到:

无效签名:预期的 HMAC SHA256 十六进制摘要 217478.6054950:private-production1_xxxxx_1232:{"user_id":xxxx},但得到 707d39519ca7f971a134524d8fe2ebafbddd64f42b6af0a20d6a73fxxxxxxx

总的来说,我们的 websocket 工作正常。我们有许多客户工作得很好,而且套接字通常似乎没有问题。这是我第一次注意到这个错误并且我经常检查错误日志。这是我应该关心的事情吗?我可以确认private 频道总体上工作正常。

前端代码如下:

let options = PusherClientOptions(
  authMethod: AuthMethod.authRequestBuilder(authRequestBuilder: AuthRequestBuilder()
)
pusher = Pusher(key: pusherKey!, options: options)

class AuthRequestBuilder: AuthRequestBuilderProtocol {
  func requestFor(socketID: String, channel: PusherChannel) -> NSMutableURLRequest? {
    let request = NSMutableURLRequest(url: URL(string: "https://\(baseURLPrefix).xxxxxx.com/xxxxx/xxxxx")!)
    request.httpMethod = "POST"
    request.httpBody = "socket_id=\(socketID)&channel_name=\(channel.name)".data(using: String.Encoding.utf8)
    request.addValue(
      "Bearer " + authToken, forHTTPHeaderField: "Authorization"
    )
    return request
  }
}

在后端(Laravel 应用程序):

// Controller

public function presence_auth(Request $request)
{
    $pusher = new Pusher(
        config('broadcasting.connections.pusher.key'),
        config('broadcasting.connections.pusher.secret'),
        config('broadcasting.connections.pusher.app_id')
    );

    return $pusher->presence_auth($request->input('channel_name'), $request->input('socket_id'), AuthUser()->id);
}

如果他们将错误的 Bearer 令牌传递给我们的后端,是否会发生此错误?

【问题讨论】:

    标签: ios swift pusher pusherswift


    【解决方案1】:

    您正在使用$pusher->presence_auth 为私人频道创建签名,即以private- 为前缀的频道。但presence_auth 旨在验证存在通道,即以presence- 为前缀的通道。

    如果您希望使用在线状态数据,您可以使用presence- 频道前缀。如果您想使用没有在线信息的private- 频道,您可以使用:

    $pusher->socket_auth($request->input('channel_name'), $request->input('socket_id'))
    

    【讨论】:

    • @chasenyc 该应用程序应配置身份验证端点 URL(请参阅AuthMethod.endpoint in config docs)。我猜该 URL 的服务器正在生成无效的身份验证签名。它使用的是什么库?
    • @chasenyc 后端。如果您使用AuthMethod.endpoint(如果这是一个生产应用程序,您可能应该使用它),无效签名可能是由您的后端在身份验证 URL 处生成的。你在用AuthMethod.endpoint吗?
    • 它用于私人和出席,我查看了出席身份验证源代码,它适用于私人。由于重新连接时 pusherswift 的一些限制,我们有意识地决定始终使用presence_auth。我仍然不确定您的回答是否解释了一次性错误的原因。
    • @chasenyc 抱歉,我没有意识到这是一次性错误。如果您有可重现的示例(例如,您引用的日志行没有编辑任何内容,加上您的 Pusher 应用程序凭据),您可以联系 Pusher 支持。在不泄露敏感细节的情况下,很难公开调试。