zavrik/laravel-centrifugo

0.3 2021-11-08 15:13 UTC

This package is auto-updated.

Last update: 2024-09-07 13:51:53 UTC


README

本包是为了更方便地在 Centrifugo v3Laravel 框架Docker 中使用。它实现了在 Docker 内部的代理连接,以便在 WebSocket 连接中存在一些数据时触发事件。

安装

  1. 复制到 .env 文件
CENTRIFUGO_APP_DOCKER_URL=http://<YOUR_CENTRIFUGO_CONTAINER_NAME>:<YOUR_CENTRIFUGO_PORT>
CENTRIFUGO_PROXY_DOCKER_URL=http://<YOUR_CONTAINER_NAME_FOR_PROXY_REDIRECT>
CENTRIFUGO_TOKEN_HMAC_SECRET_KEY=37246e8e-6943-444f-9f5c-c8d3241af361
CENTRIFUGO_ADMIN_PASSWORD=c32c421a-2123-4e8b-b063-c849e6dab599
CENTRIFUGO_ADMIN_SECRET=d37f2351-24e6-4373-9462-c2030e0eaf40
CENTRIFUGO_API_KEY=719521ac-72ce-4621-ad36-5fe0c8cbfd47
  1. 执行命令 php artisan laravel:centrifugo:init 并清除缓存。
  2. 将此容器添加到您的 docker-compose 文件中
  centrifugo:
    container_name: centrifugo
    image: centrifugo/centrifugo:v3
    volumes:
      - ./docker/centrifugo/config.json:/centrifugo/config.json
    command: centrifugo -c config.json
    ports:
      - '8000:8000'
    ulimits:
      nofile:
        soft: 65535
        hard: 65535
    networks:
      - <YOUR DOCKER NETWORK>

用法

自动生成配置

命令 php artisan laravel:centrifugo:init 为 Laravel 生成 config/centrifugo.php,为 Centrifugo 生成 docker/centrifugo/config.json。它通过 .env 和 centrifugo 密钥为您生成默认的代理路由。

安全性

默认情况下,它使用 Laravel Passport 令牌来识别用户,并且可以连接到 Centrifugo。您可以通过实现 AuthGuardInterface 来编写自己的守卫器。

interface AuthGuardInterface
{
    public function auth(Request $request): int;

    public function encodeUserId(int $userId): string;

    public function decodeUserId(string $hashedUserId): int;
}

auth(Request $request): int

提供带有可以发送的请求体的请求,您必须返回通过 WebSocket 连接的用户 ID。

encodeUserId(int $userId): string

将用户 ID 编码成唯一的字符串以安全地显示用户 ID。默认使用 Hashids 库。

decodeUserId(string $hashedUserId): int

解码散列用户 ID,以便在事件中正确设置用户 ID。

代理事件

Centrifugo 有 4 个代理路由。我们只使用其中的 3 个,因为刷新代理在 AuthGuard 身份验证中未使用。您可以通过保护应用程序令牌来选择哪些用户可以连接到 Centrifugo。

connect

在成功保护令牌后,它将带有用户 ID 的 ConnectEvent 分发。

subscribe

在用户成功订阅频道后,分发带有 UsedID 和频道名称的 SubscribeEvent

publish

在用户成功在频道中发布数据后,分发带有 UserID、频道和发布数据的 PublishEvent

前端使用

您必须使用默认的 Centrifugo JS 库。以下是一个使用默认 BearerToken 连接的示例

const centrifuge = new Centrifuge("ws://:8000/connection/websocket");
centrifuge.setConnectData({
    token: bearerToken
});
centrifuge.connect();
let subscription  = centrifuge.subscribe(channel, function(ctx) {
    container.innerHTML = ctx.data.value;
    document.title = ctx.data.value;
});

通过 centrifuge.setConnectData 您可以将任何数据发送到 AuthGuard 的请求体中。