新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何用 client_connected Reducer 拒绝 SpacetimeDB 的指定客户端连接

发布时间:2026/9/13 18:54:46来源:尧图网络
如何用 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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Lexical 团队数据自动化生成指南:从 GitHub 贡献者数据到 team.json 的完整流程 2026/9/13 19:24:48

Lexical 团队数据自动化生成指南:从 GitHub 贡献者数据到 team.json 的完整流程

Lexical 团队数据自动化生成指南:从 GitHub 贡献者数据到 team.json 的完整流程 【免费下载链接】lexical Lexical is an extensible text editor framework that provides excellent reliability, accessibility and performance. 项目地址: https://gitcode.com…

阅读更多 →
Open SWE:开源编程助手框架解析与应用实践 2026/9/13 19:24:48

Open SWE:开源编程助手框架解析与应用实践

1. Open SWE项目概述:复刻顶级科技公司的内部编程助手Open SWE是LangChain团队基于Deep Agents和LangGraph构建的开源框架,专门用于创建企业内部编程助手。这个项目复刻了Stripe、Coinbase等顶尖科技公司内部工具的核心架构模式,包括隔离云沙…

阅读更多 →
jcode 跨机器远程控制实战:WebSocket 网关的配对、远程会话驱动与排障 2026/9/13 19:24:48

jcode 跨机器远程控制实战:WebSocket 网关的配对、远程会话驱动与排障

jcode 跨机器远程控制实战:WebSocket 网关的配对、远程会话驱动与排障 【免费下载链接】jcode The most RAM efficient harness 项目地址: https://gitcode.com/GitHub_Trending/jcod/jcode 本篇指南基于 jcode 仓库中的 远程脚本说明文档 展开,讲…

阅读更多 →
yfinance 如何设置 locale 让 Ticker.info 返回本地语言的公司名称 2026/9/13 19:24:47

yfinance 如何设置 locale 让 Ticker.info 返回本地语言的公司名称

yfinance 如何设置 locale 让 Ticker.info 返回本地语言的公司名称 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 用 yfinance 拉取股票资料时,Ticker.info 默认返回…

阅读更多 →
TRL 训练加速实战指南:vLLM 快速生成、优化注意力、Liger Kernel 与混合精度 2026/9/13 19:24:47

TRL 训练加速实战指南:vLLM 快速生成、优化注意力、Liger Kernel 与混合精度

TRL 训练加速实战指南:vLLM 快速生成、优化注意力、Liger Kernel 与混合精度 【免费下载链接】trl Train transformer language models with reinforcement learning. 项目地址: https://gitcode.com/GitHub_Trending/tr/trl 本篇指南基于 TRL 官方文档 spee…

阅读更多 →
CANoe与CAPL在HiL测试中的核心职责与自动化实战解析 2026/9/13 19:21:47

CANoe与CAPL在HiL测试中的核心职责与自动化实战解析

在汽车测试这个圈子里混久了你会发现一个很有意思的现象:岗位JD里几乎都会写“熟悉CANoe、会CAPL优先”,面试时也总被问“你在HiL测试里怎么用CANoe的”。很多新人会困惑:CANoe不就是个看报文的工具吗?CAPL到底要会到什么程度才算…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞