如何通过Netcode for GameObjects实现客户端向游戏服务器传输登录令牌?
基于Netcode for GameObjects(NGO)的登录令牌验证实现方案
完全不用额外套TCP/UDP,NGO本身就支持在连接阶段嵌入自定义验证逻辑,直接用它的连接审批机制就能搞定,步骤如下:
1. 客户端:发起连接时携带令牌
拿到认证API返回的令牌后,把令牌编码成字节数组塞进NGO的连接配置里,再发起连接:
// 客户端代码 string authToken = "从认证API获取的有效令牌"; // 将令牌转为字节数组,塞进NGO的连接数据中 NetworkManager.Singleton.NetworkConfig.ConnectionData = System.Text.Encoding.UTF8.GetBytes(authToken); // 发起客户端连接 NetworkManager.Singleton.StartClient();
2. 服务器:开启连接审批并验证令牌
服务器必须启用连接审批功能,这是NGO处理自定义验证的核心:
第一步:启用连接审批
在Unity编辑器的NetworkManager组件面板中,勾选Enable Connection Approval选项。
第二步:编写验证逻辑
注册审批回调函数,在回调里解析客户端传来的令牌并验证有效性:
// 服务器初始化代码 void Start() { // 注册连接审批回调 NetworkManager.Singleton.NetworkConfig.ConnectionApprovalCallback += OnConnectionApproval; // 启动服务器 NetworkManager.Singleton.StartServer(); } // 连接审批回调 private void OnConnectionApproval(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response) { // 解析客户端传来的令牌 string authToken = System.Text.Encoding.UTF8.GetString(request.Payload); // 调用自定义逻辑验证令牌(比如查数据库、校验JWT签名等) bool isTokenValid = ValidateAuthToken(authToken); // 设置审批结果 response.Approved = isTokenValid; response.CreatePlayerObject = isTokenValid; // 验证通过才创建玩家对象 response.Reason = isTokenValid ? "验证通过" : "无效或过期的令牌"; } // 自定义令牌验证方法 private bool ValidateAuthToken(string token) { // 这里实现你的验证逻辑: // 比如检查数据库中是否存在该令牌、是否未过期、是否绑定合法用户ID // 示例逻辑(替换为实际业务代码): return !string.IsNullOrEmpty(token) && CheckTokenInDatabase(token); }
3. 额外注意事项
- 推荐用JWT作为令牌格式,服务器可以直接解析令牌中的用户ID、过期时间等信息,不用每次都查数据库,提升验证效率。
- 验证失败时,客户端可以监听
NetworkManager.Singleton.OnClientDisconnectCallback,获取断开原因并提示用户重新登录。 - 敏感场景下可以对令牌做额外加密(比如AES),不过NGO默认的连接传输已经有加密,配合HTTPS获取令牌的流程,安全性足够。
内容的提问来源于stack exchange,提问作者Myosotis
相关产品推荐
相关产品推荐

