游戏服务器登录认证
游戏需进行登录、账号密码验证、上线下线记录等,当客户端向游戏服务器连接之前,先和账号登录服务器连接。另一种情况是客户端直接和游戏服务器相连,然后游戏服务器作为客户端的代理向账号登录服务器进行验证。验证后获取游戏服务器列表,由玩家选择进入那个游戏服务器。
账号登录服务器
账号登录服务器具有两个职责,分别是管理账号和验证账号。
- 管理账号
账号的注册生成、删除等操作,账号一般会使用数据库进行管理。 - 验证账号
注册后会生成账号,登录游戏时会输入账号密码或通过第三方登录的方式来操作。
登录行为中可能会出现的异常情况
- 同一账户在多个终端登录
- 同一账户登录报文被持续多次发送
- 登录过程中某服务进程失效
- 登录过程中终端连接已断开
为保证登录过程的健壮,可使用多段登录、服务器无状态化、时序图推到。
- 多段登录
登录过程越长设计的服务进程越多,不确定因素风险也就越大。 若服务器架构合理可将服务器架构按功能区块化即微服化,根据分而治之的原理,将整个登录过程拆分为多个模块,每个登录处理模块相对独立做成多段式登录。
多段登录好处在于
- 登录复杂度被降幂,登录过程简化。
- 多段登录中即使某段登录不成功也只会让某部分游戏功能失效。
多段登录常见划分形式
- 大厅段登录以保证能够正常进入大厅
- 房间段登录以保证能够正常进入房间
- 跨服网关段登录以保证正常跨服操作,比如跨服聊天等。
服务无状态化
多服务进程间通信之所以容易产生问题,其中一个很大的原因是代码实现中会在多个进程中保存同一账号相关的数据,因此容易发生服务进程间数据不同步。所有类型服务器都可以做成无状态化的,这样登录过程的复杂度又降低了一个幂次。
时序图推导
多服务器交互过程中如果直接编码,从代码上反查通常会很苦难。如果有工具能将整个过程清晰的描绘出来,那么检查其中的错误会方便很多。整个流程都确定后再编码,可以事半功倍。而这个工具就是时序图。
大厅登录
登录涉及服务
大厅段登录会涉及到的服务进程包括客户端Client、登录服Login、大厅服Lobby、缓存服Cache、数据库服DB。
- Login 负责账号验证,包括第三方平台账号验证。
- Lobby 负责个人业务,不涉及多玩家交互。
登录实现思路
- Login、Lobby无状态化,数据临时存放在Cache中。
- Login通过DB验证账号密码并将自己和Lobby的令牌存入Cache
- Client通过令牌正常与Login和Lobby交互
登通信方式
从传统的角度来看首先会先到使用TCP,如果使用HTTP登录流程的复杂度将再次降幂,可以基于大型网站运维手段部署Login和Lobby,因此采用HTTP作为通讯手段。
目前苹果公司app商家审核是禁止HTTP通信的,所以最好使用HTTPS作为通信协议。使用HTTPS的好处是信息被加密,同时带来缺点是服务器资源额外的开销,包括CPU和带宽等。
登录令牌
对于TCP连接而言,Token令牌只用于连接后的第一次身份验证,随后Token失效,因此可以认为是非常安全的。而对HTTP/HTTPS来说,由于是基于短连接的,因此每次请求都必须携带Token,这就有可能存在Token被盗用而伪造请求的情况。因此可以将Token做加密处理,比如使用md5(token + salt)的方式,让salt变化即生成动态令牌。
登录时序
多终端登录
- 当暂无账号信息创建账号时,实现中必须保证当且仅当没有账号数据时才创建账号。
- 最后终端将重置令牌,因此之前的终端中的令牌局部可用。