GMCP 扩展:MUD 客户端认证

本文档定义了一项新的 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(字符串,当 typeoauth 时必填):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 {}

示例流程(密码凭证):

  1. 客户端连接并发送:
    Core.Supports.Set ["Char.Login 1", ...]
  2. 服务器响应:
    Char.Login.Default {"type": ["password-credentials"]}
  3. 客户端发送:
    Char.Login.Credentials {"account": "username", "password": "password"}
  4. 服务器验证凭证并执行登录。

密码流程示例(来源)

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类游戏及客户端。

二、认证流程

认证过程分为三个核心步骤,按顺序执行:

  1. 初始化阶段
    客户端主动发送 Core.Auth.Init 消息,包含客户端标识(如客户端名称、版本号),向服务器请求开始认证。
  2. 挑战-响应阶段
    • 服务器收到初始化请求后,生成随机挑战值(Challenge),通过 Core.Auth.Challenge 消息发送给客户端,挑战值需具备随机性(推荐长度≥16字节),防止重放攻击。
    • 客户端接收挑战值后,使用预配置的客户端私钥对挑战值进行签名,生成响应数据,通过 Core.Auth.Response 消息发送给服务器,消息需包含签名结果及客户端标识。
  3. 确认阶段
    服务器验证客户端签名的有效性:
    • 若验证通过,发送 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") 通知客户端认证失败

四、安全要求

  1. 挑战值安全性:挑战值必须随机生成,不可重复使用,推荐使用加密安全的随机数生成器(如CSPRNG),长度≥16字节。
  2. 签名机制:客户端需使用非对称加密算法(如RSA、ECDSA)对挑战值签名,私钥由客户端预先配置,服务器需存储对应公钥用于验证。
  3. 传输安全:建议在TLS加密通道中传输认证消息,防止挑战值、签名等敏感数据被窃听或篡改。
  4. 超时限制:服务器可在 Core.Auth.Challenge 中指定 timeout(如30秒),客户端需在超时前发送响应,否则认证失败。

五、兼容性与失败处理

  1. 版本兼容:规范支持不同版本客户端,服务器需兼容至少1.0及以上版本的GMCP认证消息格式,客户端应明确声明支持的版本。
  2. 失败处理
    • 服务器需在 Core.Auth.Failure 中明确失败原因,帮助客户端排查问题(如私钥不匹配、挑战值过期)。
    • 为防止暴力破解,服务器可限制认证重试次数(推荐≤3次),超过次数后临时封禁客户端IP或延长重试间隔。

关键问题
  1. 问题:GMCP认证的核心安全机制是什么?如何防止重放攻击?
    答案:核心安全机制是挑战-响应机制数字签名。服务器生成随机且唯一的挑战值,客户端用私钥对挑战值签名,服务器通过公钥验证签名有效性;通过使用随机挑战值(每次认证不同) 及设置超时时间,防止攻击者重复使用历史签名数据实施重放攻击。

  2. 问题:GMCP认证流程中,客户端和服务器分别需要发送哪些关键消息?
    答案:客户端需发送 Core.Auth.Init(初始化请求)和 Core.Auth.Response(签名响应);服务器需发送 Core.Auth.Challenge(挑战值)、Core.Auth.Success(认证成功)或 Core.Auth.Failure(认证失败)。

  3. 问题:若GMCP认证失败,服务器应如何处理?需向客户端提供哪些信息?
    答案:服务器需发送 Core.Auth.Failure 消息,明确包含失败原因(如"invalid_signature"“timeout”“unknown_client”等);同时为安全起见,应限制客户端重试次数(推荐≤3次),避免暴力破解,必要时可临时封禁异常客户端。

京ICP备13031296号-4