如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接
如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDBSpacetimeDB 的模块对外网暴露任何客户端都能尝试连接。当你在模块里做了身份验证基于 OIDC token就需要在连接建立时判断“这个客户端是谁、token 来自哪里”对不符合条件的客户端直接断开。SpacetimeDB 提供的机制是client_connected生命周期 Reducer它在一个客户端建立连接时运行只要它在运行中返回错误Rust/C 返回ErrC#/TypeScript 抛出异常服务端就会断开该客户端的连接。本文以 Rust 模块为主路径说明如何实现“拒绝指定客户端”并给出 C# 与 C 的等价写法以及文档中记录的验证方式。client_connected Reducer 的行为边界在动手写代码前先明确 生命周期 Reducer 文档中对client_connected的约束这些直接决定你拒绝逻辑能写什么不能接受除ReducerContext以外的参数——拒绝条件只能基于上下文发送方身份、认证声明、连接 ID 等不能基于客户端传入的参数。每次连接建立时各运行一次运行对象是每个独立连接WebSocket、HTTP 调用。运行中返回错误失败会断开该客户端的连接。上下文提供该连接的连接 ID但 API 暴露为可空/可选项Rust 中ctx.connection_id()返回OptionConnectionId使用前需要先判空。这意味着“拒绝”这个动作本身不需要显式调用任何断连 API只需要让 Reducer 失败即可。主路径Rust 模块中拒绝连接先按 Cheat Sheet 的项目设置流程准备一个模块项目spacetime init --lang rust ...、spacetime login、spacetime publish DATABASE_NAME然后在模块代码中写入client_connectedReducer。最简单的形式是拒绝所有连接这是 Reject Client Connections 文档给出的示例#[reducer(client_connected)] pub fn client_connected(_ctx: ReducerContext) - Result(), String { let client_is_rejected true; if client_is_rejected { Err(The client connection was rejected. With our current code logic, all clients will be rejected..to_string()) } else { Ok(()) } }“拒绝指定客户端”则是把client_is_rejected换成基于上下文的判断条件。文档中最完整的“按条件拒绝”示例来自 Using Auth Claims 文档的“Restricting auth providers”一节只接受指定 OIDC issuer 且 audience 匹配你自己 SpacetimeAuth 项目的客户端。该文档同时说明用户可以用任意有效 token 连接 SpacetimeDB因此最好在连接时至少检查 issuer并且要检查aud声明确保签发方是把你自己的应用当作接收方签发的 token。// Set this to your the OIDC client (or set of clients) set up for your // SpacetimeAuth project. const OIDC_CLIENT_ID: str client_XXXXXXXXXXXXXXXXXXXXXX; #[reducer(client_connected)] pub fn connect(ctx: ReducerContext) - Result(), String { let jwt ctx.sender_auth().jwt().ok_or(Authentication required.to_string())?; if jwt.issuer() ! https://auth.spacetimedb.com/oidc { return Err(Invalid issuer.to_string()); } if !jwt.audience().iter().any(|a| a OIDC_CLIENT_ID) { return Err(Invalid audience.to_string()); } Ok(()) }代码中OIDC_CLIENT_ID需要替换为你自己 SpacetimeAuth 项目中配置的 OIDC client ID文档示例中是占位值client_XXXXXXXXXXXXXXXXXXXXXX。issuer 值https://auth.spacetimedb.com/oidc是 SpacetimeAuth 的 issuer如果你使用其他 OIDC 提供商Auth0、Clerk 等把比较目标换成对应提供商的 issuer。两个需要留意的细节均来自上述文档客户端没有携带 token 连接时ctx.sender_auth().jwt()为None示例中用ok_or(Authentication required)直接拒绝。而 Authentication 文档说明客户端不带 token 连接时SpacetimeDB 会为该客户端创建新身份并返回服务端签发的 token——也就是说“没有 JWT 就拒绝”这条判断会拦截所有未登录的匿名连接。除了 issuer/audience文档还展示了读取自定义声明的做法例如解析 JWT payload 中的roles字段、Steam 场景下解析steam_owned_games字段判断是否拥有指定应用思路一致在client_connected中读取声明不满足条件就返回Err。可选分支C# 与 C 模块的等价写法同样的“失败即断连”模式在其他语言中对应抛出异常或返回错误。C# 模块来自 Reject Client Connections 文档[Reducer(ReducerKind.ClientConnected)] // Called when a client connects to a SpacetimeDB database server public static void ClientConnected(ReducerContext ctx) { throw new Exception(The client connection was rejected. With our current code logic, all clients will be rejected.); }C# 中按认证声明拒绝的写法来自 Using Auth Claims 文档// The oidc client ids configured for SpacetimeAuth. public static readonly Liststring OIDC_CLIENT_IDS new() { client_XXXXXXXXXXXXXXXXXXXXXX, }; public void Connect(ReducerContext ctx) { var claims ctx.SenderAuth.Jwt ?? throw new Exception(Client connected without JWT); if (claims.Issuer ! https://auth.spacetimedb.com/oidc) { throw new Exception(Unauthorized: invalid issuer); } if (!OIDC_CLIENT_IDS.Any(s claims.Audience.Contains(s))) { throw new Exception(Unauthorized: invalid audience); } }C 模块来自 Reject Client Connections 文档注意 C 模块文档带版本提示CppModuleVersionNotice功能可用性以 C 模块的当前版本说明为准using namespace SpacetimeDB; SPACETIMEDB_CLIENT_CONNECTED(client_connected, ReducerContext ctx) { bool client_is_rejected true; if (client_is_rejected) { return Err(The client connection was rejected. With our current code logic, all clients will be rejected.); } else { return Ok(); } }C 中按认证声明拒绝的完整示例issuer audience 检查见 Using Auth Claims 文档的 C 标签页。构建、发布与验证模块改完后按常规流程构建并发布Cheat Sheet 中的命令spacetime build spacetime publish DATABASE_NAME发布成功后验证拒绝是否生效文档给出的判断依据有两侧服务端日志。无论客户端是什么类型客户端被断开后服务模块日志中会包含一条 ERROR 记录内容就是你返回的错误消息。用spacetime logs DATABASE_NAME或spacetime logs --follow DATABASE_NAME查看命令来自 Cheat Sheet。文档中的示例日志文档示例实际消息取决于你返回的字符串ERROR: : The client connection was rejected. With our current code logic, all clients will be rejected.客户端侧症状文档按客户端 SDK 分别描述TypeScript 客户端会收到Error connecting to SpacetimeDB:以及一个 code 为 1006 的CloseEvent。C# 客户端文档注明断连行为目前未定义会生成形如Disconnected abnormally: System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.的错误。Rust 客户端各语言标签页的描述不完全一致C# 标签页写的是会收到on_disconnected事件且无错误消息Rust/C 标签页写的是行为未定义并可能产生Unable to send subscribe message: ...类错误。以服务端日志作为主判据更稳妥。验证时可以用两个客户端对照一个携带符合 issuer/audience 条件的 token应能正常连接并执行后续调用另一个不带 token 或携带其他 issuer 的 token应被断开同时服务端日志出现对应 ERROR 记录。限制说明client_connected不能接收任何自定义参数所有判断必须落在ReducerContext能拿到的信息上身份、认证声明、连接 ID、时间戳。拒绝发生在连接建立阶段被拒绝的客户端不会收到一次可正常调用的会话它看到的就是上述各类断开/连接错误因此错误消息的可见性以服务端日志为主。如果你还需要在连接建立后例如调用普通 reducer 时做更细粒度的权限判断文档给出的做法是复用同样的认证声明检查逻辑在 reducer 内部用ctx.sender_auth()校验例如自定义 claims 文档中ensure_admin_access的写法。【免费下载链接】SpacetimeDBDevelopment at the speed of light项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制

Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制

Compose for Web 事件处理详解:从 attrs 事件监听器到 addEventListener 的完整机制 【免费下载链接】compose-multiplatform Compose Multiplatform, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and en…

2026/9/13 18:54:48 阅读更多 →
Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持

Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持

Beekeeper Studio 连接 Redis 完全指南:ACL 认证、TLS/SSH 与 ReJSON 支持 【免费下载链接】beekeeper-studio Modern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows. 项目地址: https://gitcode.co…

2026/9/13 18:54:48 阅读更多 →
PMSM电机FOC控制全解析:从坐标变换到无感调试

PMSM电机FOC控制全解析:从坐标变换到无感调试

FOC在圈里被吹得神乎其神,但也确实劝退了很多人。早几年我刚开始碰PMSM无感控制的时候,光看那堆坐标变换的公式推导就想摔键盘。后来真正把代码跑起来、把波形调出来,回头看才发现,FOC没有那么玄乎,但也绝不是一个晚上…

2026/9/13 18:54:48 阅读更多 →

最新新闻

litellm遭投毒?Python供应链安全自查与止损指南

litellm遭投毒?Python供应链安全自查与止损指南

这两天 litellm 被投毒的消息在开发群里和热搜上同时炸开了锅。如果你也是跑大模型应用的开发者,手头大概率装了 litellm——这个开源的统一 API 网关,平时用它接 OpenAI、Anthropic、本地 vLLM,省事是真的省事。可一旦这种基础设施级的库被混…

2026/9/13 19:50:14 阅读更多 →
core-js 模块直接在浏览器加载产生大量请求怎么解决:打包成单 bundle 上线

core-js 模块直接在浏览器加载产生大量请求怎么解决:打包成单 bundle 上线

core-js 模块直接在浏览器加载产生大量请求怎么解决&#xff1a;打包成单 bundle 上线 【免费下载链接】core-js Standard Library 项目地址: https://gitcode.com/GitHub_Trending/co/core-js 如果你的前端页面没有走本地打包器&#xff0c;而是通过 <script> 或…

2026/9/13 19:50:14 阅读更多 →
Renovate Artifactory Datasource 全解析:让 Renovate 从 JFrog Artifactory 自动发现 Conan 包版本

Renovate Artifactory Datasource 全解析:让 Renovate 从 JFrog Artifactory 自动发现 Conan 包版本

Renovate Artifactory Datasource 全解析&#xff1a;让 Renovate 从 JFrog Artifactory 自动发现 Conan 包版本 【免费下载链接】renovate Home of the Renovate CLI: Cross-platform Dependency Automation by Mend.io 项目地址: https://gitcode.com/GitHub_Trending/re/r…

2026/9/13 19:50:14 阅读更多 →
如何配置环境并运行 PyG 的 CPU 训练基准测试 training_benchmark.py?

如何配置环境并运行 PyG 的 CPU 训练基准测试 training_benchmark.py?

如何配置环境并运行 PyG 的 CPU 训练基准测试 training_benchmark.py&#xff1f; 【免费下载链接】pytorch_geometric Graph Neural Network Library for PyTorch 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric 这篇文章对应一个明确的性能测量…

2026/9/13 19:50:14 阅读更多 →
Arduino-ESP32 项目全解析:ESP32 系列 SoC 的 Arduino 核心架构、芯片支持矩阵与开发调试实践

Arduino-ESP32 项目全解析:ESP32 系列 SoC 的 Arduino 核心架构、芯片支持矩阵与开发调试实践

Arduino-ESP32 项目全解析&#xff1a;ESP32 系列 SoC 的 Arduino 核心架构、芯片支持矩阵与开发调试实践 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 本文以官方仓库 …

2026/9/13 19:50:14 阅读更多 →
STM32 VS Code开发环境搭建与实战调试指南

STM32 VS Code开发环境搭建与实战调试指南

1. 为什么STM32开发者正在集体迁入VS Code——不是跟风&#xff0c;是工具链演进的必然结果 最近三个月&#xff0c;我带的三个嵌入式新人项目组里&#xff0c;有两位主动把开发环境从Keil MDK切到了VS Code GCC ARM工具链。不是因为“VS Code看起来酷”&#xff0c;而是他们在…

2026/9/13 19:49:13 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南&#xff1a;掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战&#xff1a;基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时&#xff0c;甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事&#xff0c;打开配置文件改一行不就完了&#xff1f;结果真动手才发现&#xff0c;Flutter项目里“应用名称”根本不是一处配置&#xff0c;而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南&#xff1a;掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战&#xff1a;基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时&#xff0c;甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事&#xff0c;打开配置文件改一行不就完了&#xff1f;结果真动手才发现&#xff0c;Flutter项目里“应用名称”根本不是一处配置&#xff0c;而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →