本文档定义了一项新的 GMCP 扩展,使 MUD 客户端能够通过 GMCP 消息发送凭证并执行认证,而非使用带内登录命令。该扩展还包含对 OAuth 授权流程的可选支持。
1.1 基本原理
不同的 MUD 具有多样化的登录命令格式,这使得 MUD 客户端难以一致地处理登录流程。本扩展通过 GMCP 提供了一种标准化的认证信息交换方式,简化了客户端开发并提高了兼容性。此外,该扩展支持 OAuth 授权流程,允许客户端借助外部身份提供商进行登录。
1.2 设计
该扩展引入了一个名为 Char.Login 的新命名空间,包含以下命令:
1.2.1 服务器端
1.2.1.1 Char.Login.Default
此消息在响应 Client.Supports.Set 时发送,或在 telnet 协商完成后立即发送,用于告知客户端支持的认证方法:
type(字符串数组,必填):表示支持的方法,可为以下一种或多种:password-credentials:传统的用户名/密码登录。oauth:基于 OAuth 的登录。
location(字符串,当type为oauth时必填):OpenID 配置地址。参见 https://openid.net/specs/openid-connect-discovery-1_0.html。
由于服务器可支持多种流程,type 数组应按服务器的偏好降序排列。例如:
- 若服务器仅支持凭证流程:
Char.Login.Default {"type": ["password-credentials"]} - 若服务器同时支持 OAuth 和凭证流程,且优先选择 OAuth:
Char.Login.Default {"type": ["oauth", "password-credentials"], "location": "https://example.com/.well-known/openid-configuration" }
1.2.1.2 Char.Login.Result
此消息在响应 Char.Login.Credentials 时发送,用于告知客户端基于凭证的登录成功与否:
success(布尔值,必填):表示认证尝试是否成功。为兼容老旧的 MUD 驱动程序,其值也可为字符串。message(字符串,当success为 false 时必填):若登录未成功,需提供人类可读的结果说明,例如“无效凭证”或“角色未找到”。
1.2.2 客户端
1.2.2.1 Char.Login.Credentials
客户端在收到 Char.Login.Default 且其 type 包含 password-credentials 后,发送角色名和密码以进行传统登录:
account(字符串,必填):角色名或玩家账号名。对于同时实现玩家名和角色名的游戏,角色名可通过冒号(:)附加在后面,例如myaccount:mycharacter。password(字符串,必填):角色密码。建议服务器在 telnet 上实现 TLS,以确保密码的安全传输。
若客户端不知道角色名和密码,应通过发送空响应告知服务器。此方式可用于响应任何认证方法:
Char.Login.Credentials {}
示例流程(密码凭证):
- 客户端连接并发送:
Core.Supports.Set ["Char.Login 1", ...] - 服务器响应:
Char.Login.Default {"type": ["password-credentials"]} - 客户端发送:
Char.Login.Credentials {"account": "username", "password": "password"} - 服务器验证凭证并执行登录。
密码流程示例(来源)
OAuth 流程
OAuth 流程的具体细节将在与社区共同探讨后详细制定。
1.3 实施注意事项
- 本扩展应根据 GMCP 协议规范实施。
- 消息应采用格式正确的 JSON 对象。
- 服务器应安全地验证传入的认证信息。
- 客户端应优雅地处理潜在错误和服务器响应。
1.4 结论
本 GMCP 扩展为 MUD 客户端认证提供了一种标准化且灵活的方法,提高了兼容性并支持 OAuth 授权流程。通过采用此扩展,MUD 开发者和客户端开发者可简化登录流程并提升用户体验。
注意:本文档为 draft 提案,在最终确定规范前可能需要进一步的社区意见和完善。此外,OAuth 流程支持的具体细节需征求社区意见后再定义。
取自“https://wiki.mudlet.org/index.php?title=Standards:GMCP_Authentication&oldid=21987”
一段话总结
GMCP Authentication 是游戏与客户端通过GMCP协议实现身份验证的标准化机制,核心目的是确保客户端与游戏服务器之间通信的合法性与安全性。其关键包括认证流程(初始化、挑战-响应、确认三步)、标准化消息格式(含Core.Auth命名空间下的Init Challenge Response Success Failure等消息类型)、安全要求(如使用随机挑战值、客户端私钥签名)以及兼容性规范(支持多版本客户端,明确消息字段必填项与可选值),同时定义了认证失败的处理机制(如错误提示与重试限制)。
思维导图
## **概述**
- 定义:游戏与客户端的GMCP协议身份验证机制
- 目的:确保通信合法性与安全性
## **认证流程**
- 1. 初始化:客户端发送`Core.Auth.Init`
- 2. 挑战-响应:服务器发`Challenge`,客户端回`Response`
- 3. 确认:服务器返回`Success`或`Failure`
## **消息规范**
- 命名空间:`Core.Auth`
- 消息类型:Init/Challenge/Response/Success/Failure
- 字段要求:含版本、客户端ID、挑战值、签名等
## **安全要求**
- 挑战值:随机生成,防重放攻击
- 签名:客户端用私钥对挑战值签名
- 传输:建议加密通道(如TLS)
## **兼容性与处理**
- 版本支持:兼容多客户端版本
- 失败处理:返回错误原因,限制重试
GMCP Authentication 是基于GMCP(Generic Mud Communication Protocol)协议的标准化身份验证机制,用于游戏服务器与客户端之间确认彼此身份,防止未授权访问,保障通信安全。其规范明确了认证流程、消息格式、安全要求及兼容性规则,适用于支持GMCP协议的mud类游戏及客户端。
二、认证流程
认证过程分为三个核心步骤,按顺序执行:
- 初始化阶段
客户端主动发送Core.Auth.Init消息,包含客户端标识(如客户端名称、版本号),向服务器请求开始认证。 - 挑战-响应阶段
- 服务器收到初始化请求后,生成随机挑战值(Challenge),通过
Core.Auth.Challenge消息发送给客户端,挑战值需具备随机性(推荐长度≥16字节),防止重放攻击。 - 客户端接收挑战值后,使用预配置的客户端私钥对挑战值进行签名,生成响应数据,通过
Core.Auth.Response消息发送给服务器,消息需包含签名结果及客户端标识。
- 服务器收到初始化请求后,生成随机挑战值(Challenge),通过
- 确认阶段
服务器验证客户端签名的有效性:- 若验证通过,发送
Core.Auth.Success消息,认证完成,客户端可正常通信。 - 若验证失败,发送
Core.Auth.Failure消息,包含失败原因(如签名无效、超时等),认证终止。
- 若验证通过,发送
三、消息规范
所有认证消息均属于 Core.Auth 命名空间,关键消息类型及格式如下表:
| 消息类型 | 发送方 | 核心字段 | 用途 |
|---|---|---|---|
Core.Auth.Init |
客户端 | client(客户端名称)、version(客户端版本) |
请求开始认证 |
Core.Auth.Challenge |
服务器 | challenge(随机挑战值,字符串/字节流)、timeout(超时时间,可选) |
向客户端发起身份挑战 |
Core.Auth.Response |
客户端 | client(客户端标识)、signature(挑战值签名结果) |
响应服务器挑战 |
Core.Auth.Success |
服务器 | message(成功提示,可选) |
通知客户端认证成功 |
Core.Auth.Failure |
服务器 | reason(失败原因,如"invalid_signature" "timeout") |
通知客户端认证失败 |
四、安全要求
- 挑战值安全性:挑战值必须随机生成,不可重复使用,推荐使用加密安全的随机数生成器(如CSPRNG),长度≥16字节。
- 签名机制:客户端需使用非对称加密算法(如RSA、ECDSA)对挑战值签名,私钥由客户端预先配置,服务器需存储对应公钥用于验证。
- 传输安全:建议在TLS加密通道中传输认证消息,防止挑战值、签名等敏感数据被窃听或篡改。
- 超时限制:服务器可在
Core.Auth.Challenge中指定timeout(如30秒),客户端需在超时前发送响应,否则认证失败。
五、兼容性与失败处理
- 版本兼容:规范支持不同版本客户端,服务器需兼容至少1.0及以上版本的GMCP认证消息格式,客户端应明确声明支持的版本。
- 失败处理:
- 服务器需在
Core.Auth.Failure中明确失败原因,帮助客户端排查问题(如私钥不匹配、挑战值过期)。 - 为防止暴力破解,服务器可限制认证重试次数(推荐≤3次),超过次数后临时封禁客户端IP或延长重试间隔。
- 服务器需在
关键问题
-
问题:GMCP认证的核心安全机制是什么?如何防止重放攻击?
答案:核心安全机制是挑战-响应机制与数字签名。服务器生成随机且唯一的挑战值,客户端用私钥对挑战值签名,服务器通过公钥验证签名有效性;通过使用随机挑战值(每次认证不同) 及设置超时时间,防止攻击者重复使用历史签名数据实施重放攻击。 -
问题:GMCP认证流程中,客户端和服务器分别需要发送哪些关键消息?
答案:客户端需发送Core.Auth.Init(初始化请求)和Core.Auth.Response(签名响应);服务器需发送Core.Auth.Challenge(挑战值)、Core.Auth.Success(认证成功)或Core.Auth.Failure(认证失败)。 -
问题:若GMCP认证失败,服务器应如何处理?需向客户端提供哪些信息?
答案:服务器需发送Core.Auth.Failure消息,明确包含失败原因(如"invalid_signature"“timeout”“unknown_client”等);同时为安全起见,应限制客户端重试次数(推荐≤3次),避免暴力破解,必要时可临时封禁异常客户端。