用户登录与认证
最后更新:2026 年 7 月 16 日
PlayServ 假定客户端在外部系统 —— 也就是你的身份提供方 —— 中完成用户认证,然后把拿到的 UserToken 传进 SDK。PlayServ 用这个 token 提升 Session 的权限,并把 Session 绑定到已有的用户档案,或者新建一个。
在以下情况下使用这个流程:
- Player 刚在你的 UI 里完成认证 —— 用户名密码、第三方登录等等
- 应用启动时,你手上已经存有此前的
UserToken - token 已失效,你需要重新认证
登录流程
在你的外部系统中认证 Player
Player 通过你的身份提供方登录 —— 用户名密码、社交账号,或你支持的任何其他方式。成功之后,你的系统签发一个 UserToken。
这一步不由 PlayServ 执行,它只消费你的系统产出的那个 token。
把 UserToken 传进 SDK
把 UserToken 交给 SDK,PlayServ 才能提升这个 Session 的权限。入口有两个,取决于你_什么时候_拿到 token —— Session 启动时用 Ready(UserToken),运行过程中用 Login(UserToken)。两者做的是同一件事。见下面的 Ready 与 Login。
PlayServ 校验并提升 Session
handshake 期间,PlayServ 会调用服务端的 ValidateClient(如果声明了的话)。校验通过,Session 权限被提升,Session 绑定到该 Player 的档案;校验不通过,客户端被拒。
Ready 与 Login:两个入口
Ready(UserToken) 和 Login(UserToken) 做的是同样的权限提升 —— 区别只在时机。
- Ready —— Session 启动时
- Login —— 运行过程中
如果用户此前已认证过、UserToken 也已存在本地,那就在启动 Session 时立刻把它传进去:
await PlayServ.Ready(UserToken);
因为提升发生在 Session 启动的那一刻,达到已认证状态会比之后再调 Login(...) 更快。
Player 在运行过程中才完成认证时,用 Login(UserToken) —— 比如他在你的登录界面输完了账号密码:
// External authentication returns a UserToken
var result = await PlayServ.Login(UserToken);
token 失效之后
如果 Player 的会话结束,或者存下来的 token 失效了,Ready(UserToken) 处的 handshake 可能会返回错误。这时:
到外部系统重新认证
Player 在你的外部系统中重新认证,由它签发一个新的 UserToken。
用新 token 调用 Login
把新签发的 token 通过 Login(UserToken) 传进去,再次提升 Session 权限。
服务端校验:ValidateClient
要在服务端校验已认证的客户端,PlayServ 会对 ValidateClient 发起一次 RPC 调用 —— 前提是它在服务端代码中已声明。返回 true 表示接受该客户端,返回 false 表示拒绝 —— 校验不通过时,客户端拿不到权限提升,并会被断开。
[Server]
public class ClientAuth
{
public bool ValidateClient(Session session)
{
// return true -> validation passed, privileges upgraded
// return false -> client denied / disconnected
return true;
}
}
ValidateClient 就是 UserToken 有效性的把关点。请把这个方法当作你在服务端提升权限的那道闸门。
它与 handshake 和 Session 的关系
Ready(UserToken)影响 Session 启动时的 handshake 路径。Login(UserToken)做的是同样的权限提升,只是在运行过程中才发起。- Session 状态仍然是判断客户端运行时是否就绪的主要依据。
下一步
- SDK Initialisation & Handshake ——
Ready(...)如何开启这个流程 - Proxy Module & Handshake —— 认证如何影响 handshake 的准入与规则执行
- Session Lifecycle & States —— Session 状态如何反映就绪情况和被强制断开的结果
- RPC & Server-side Game Logic —— 服务端校验代码写在哪里、如何部署