UNPKG

4.48 kBMarkdownView Raw
1# 注册登录流程
2
3## 基本流程描述
4
51. 向LBS(负载均衡服务)申请目标逻辑服地址
6
7```js
8let msg = await remote.locate(
9 host, //LBS服务器地址
10 port, //LBS服务器端口
11).fetching({"func": "config.getServerInfo", "oemInfo": oemInfo});
12
13if(!!msg && msg.code == ReturnCode.Success) {
14 console.log(msg.data.ip, msg.data.port); //屏显获取的目标逻辑服地址
15}
16```
17
18关于客户端上行字段oemInfo的说明
19```json
20{
21 "domain" : "用户验证域",
22 "openid" : "用户ID",
23 "openkey" : "和openid配套的认证令牌,用于单阶段登录模式",
24 "auth" : "两阶段登录模式下,服务端签发的登录签名集",
25 "token" : "两阶段登录模式下,服务端认证登录签名集后,发放的登录令牌",
26}
27```
28
292. 申请登录令牌
30
31- 单阶段登录模式
32单阶段登录模式下,客户端借助外部Runtime的帮助,提前获取了登录令牌,因此无需再向服务端提交申请
33
34- 两阶段登录模式
35两阶段登录模式下,客户端需要向服务端提交申请,获取登录令牌,如下所示:
36
37```js
38let authPage = 'auth.html';
39
40let token = await remote.locate(
41 logicIp,
42 logicPort
43).getRequest({id: openid, thirdUrl: authPage});
44
45console.log(token); //屏显获取的登录令牌
46```
47
483. 将登录令牌发送到逻辑服进行验证、登录(新用户自动注册)
49
50```js
51let msg = await remote.fetching({
52 'func': '1000',
53 "oemInfo": oemInfo
54});
55
56if(!!msg && msg.code == ReturnCode.Success && !!msg.data) {
57 console.log(msg.data.id);
58 console.log(msg.data.token);
59}
60```
61
62登录成功后,将在客户端连接器中形成完整的用户记录 ( remote.userInfo )
63
64```json
65{
66 "domain" : "客户端填写:用户验证域,指明验证类型和服务器类型",
67 "openid" : "客户端填写:用户标识,由客户端基于唯一标定原则生成",
68 "openkey" : "客户端填写:单阶段登录模式中,客户端预先获取的登录令牌",
69 "pf" : "客户端填写:附加信息,选填",
70 "token" : "服务端下发:经服务端验证后形成的登录凭证",
71 "id" : "服务端下发:经服务端验证后形成的用户识别码"
72}
73```
74
75## 内置验证类型
76
77gamecloud 内置了四种验证类型,每种都有明确的预定义验证流程:
78- official 默认验证流程
79- 360 类360验证流程
80- tx 类腾讯验证流程
81- admin 管理后台验证流程
82
83注意:前述流程中 '用户验证域' 字段格式为 '验证类型.服务器类型'(例如 'official.IOS'),其中服务器类型取值范围由 CoreOfLogic.mapping 指定
84
85## 自定义验证流程
86
87可以根据需要自行扩展更多的验证类型,并制定与之相应的验证流程:
88
891. 新增验证文件 /app/control/CoreOfLogic/UserDefine.js, 撰写 UserDefine 类, "UserDefine" 将和 "360"、"tx" 一样,成为有效的验证类型
90
912. 为 UserDefine 类设置路由、撰写验证函数
92
93```js
94class authOfNew extends facade.Control
95{
96 get router() {
97 return [
98 ['/auth/new.html', 'auth'], //指定发放签名功能的路由、函数名
99 ];
100 }
101
102 /**
103 * 发放签名函数
104 */
105 async auth(data) {
106 let auth = {
107 t: now(), //当前时间戳,游戏方必须验证时间戳,暂定有效期为当前时间前后 5 分钟
108 userId: objData.id, //将客户端上行的平台用户 ID
109 };
110 auth.sign = sign(auth, facade.current.options[DomainType.D360].game_secret);
111 return auth;
112 }
113
114 /**
115 * 验证签名函数,约定函数名必须为 check
116 */
117 async check(oemInfo) {
118 let _sign = (oemInfo.auth.sign == facade.util.sign(oemInfo.auth, facade.current.options[DomainType.D360].game_secret));
119 let _exp = (Math.abs(oemInfo.auth.t - now()) <= 300);
120 if (!_sign || !_exp) {
121 throw new Error('authThirdPartFailed'); //未通过验证,抛出异常
122 }
123
124 return oemInfo.auth.userId; //通过验证后返回用户ID
125 }
126```
127
1283. 通过客户端调用新的验证流程
129
130```js
131it('验证自定义验签流程', async () => {
132 let msg = await remote.login({authControl: 'UserDefine'});
133 console.log(msg);
134});
135```