zavrik / laravel-centrifugo
Requires
- php: ^8.0
- ext-bcmath: *
- centrifugal/phpcent: ^4.0.0
- hashids/hashids: ^4.1
- laravel/framework: ^8.0.0
- laravel/passport: ^v10.2.0
This package is auto-updated.
Last update: 2024-09-07 13:51:53 UTC
README
本包是为了更方便地在 Centrifugo v3、Laravel 框架 和 Docker 中使用。它实现了在 Docker 内部的代理连接,以便在 WebSocket 连接中存在一些数据时触发事件。
安装
- 复制到 .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
- 执行命令
php artisan laravel:centrifugo:init
并清除缓存。 - 将此容器添加到您的
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 的请求体中。