1 | # 注册登录流程
|
2 |
|
3 | ## 基本流程描述
|
4 |
|
5 | 1. 向LBS(负载均衡服务)申请目标逻辑服地址
|
6 |
|
7 | ```js
|
8 | let msg = await remote.locate(
|
9 | host, //LBS服务器地址
|
10 | port, //LBS服务器端口
|
11 | ).fetching({"func": "config.getServerInfo", "oemInfo": oemInfo});
|
12 |
|
13 | if(!!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 |
|
29 | 2. 申请登录令牌
|
30 |
|
31 | - 单阶段登录模式
|
32 | 单阶段登录模式下,客户端借助外部Runtime的帮助,提前获取了登录令牌,因此无需再向服务端提交申请
|
33 |
|
34 | - 两阶段登录模式
|
35 | 两阶段登录模式下,客户端需要向服务端提交申请,获取登录令牌,如下所示:
|
36 |
|
37 | ```js
|
38 | let authPage = 'auth.html';
|
39 |
|
40 | let token = await remote.locate(
|
41 | logicIp,
|
42 | logicPort
|
43 | ).getRequest({id: openid, thirdUrl: authPage});
|
44 |
|
45 | console.log(token); //屏显获取的登录令牌
|
46 | ```
|
47 |
|
48 | 3. 将登录令牌发送到逻辑服进行验证、登录(新用户自动注册)
|
49 |
|
50 | ```js
|
51 | let msg = await remote.fetching({
|
52 | 'func': '1000',
|
53 | "oemInfo": oemInfo
|
54 | });
|
55 |
|
56 | if(!!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 |
|
77 | gamecloud 内置了四种验证类型,每种都有明确的预定义验证流程:
|
78 | - official 默认验证流程
|
79 | - 360 类360验证流程
|
80 | - tx 类腾讯验证流程
|
81 | - admin 管理后台验证流程
|
82 |
|
83 | 注意:前述流程中 '用户验证域' 字段格式为 '验证类型.服务器类型'(例如 'official.IOS'),其中服务器类型取值范围由 CoreOfLogic.mapping 指定
|
84 |
|
85 | ## 自定义验证流程
|
86 |
|
87 | 可以根据需要自行扩展更多的验证类型,并制定与之相应的验证流程:
|
88 |
|
89 | 1. 新增验证文件 /app/control/CoreOfLogic/UserDefine.js, 撰写 UserDefine 类, "UserDefine" 将和 "360"、"tx" 一样,成为有效的验证类型
|
90 |
|
91 | 2. 为 UserDefine 类设置路由、撰写验证函数
|
92 |
|
93 | ```js
|
94 | class 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 |
|
128 | 3. 通过客户端调用新的验证流程
|
129 |
|
130 | ```js
|
131 | it('验证自定义验签流程', async () => {
|
132 | let msg = await remote.login({authControl: 'UserDefine'});
|
133 | console.log(msg);
|
134 | });
|
135 | ```
|