用户是如何登录的?

简介

skynet_fly_demo在账号上采用了传统的账号密码方式。

流程

  1. c2s 用户调用loginserver的登录接口
  2. s2s loginserver 调用 centerserver 验证账号,密码
  3. s2s loginserver 调用 hallserver 生成token
  4. s2c loginserver 返回登录结果和token
  5. c2s 连接大厅服,发送登录请求,hallserver验证token
  6. s2c hallserver 回复登录结果

流程1

涉及skynet_fly技术

* http server 
* cluster rpc

涉及服务

* loginserver
* centerserver

客户端通过http方式调用user/login接口进行注册,客户端传递账号,密码,之后loginserver rpc 调用centerserver 进行登录验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--登录
local function login(c)
local req = c.req
local body = req.body
local account = body.account
local password = body.password
assert(account, "not account")
assert(password, "not passwword")

local isok, errcode, errmsg = rpc_center_account.auth(account, password)
if not isok then
rsp_body.set_rsp(c, nil, errcode, errmsg)
else
local player_id, hall_server_id = errcode, errmsg
local host = rpc_hall_player.get_host(player_id)
assert(host, "can`t get host")
local token = rpc_hall_player.create_token(player_id, ENUM.LOGIN_TOKEN_TIME_OUT)
assert(type(token) == "string", "create token err ")
rsp_body.set_rsp(c, {
token = token,
host = host,
player_id = player_id,
})
end
end

流程2

涉及skynet_fly技术

* cluster rpc
* orm

涉及服务

* loginserver
* centerserver

调用rpc_center_account.auth(account, password) 到centerserver 验证账号密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--验证登录
function CMD.auth(account, password)
local orm_clinet = get_orm_by_account(account)
local account_info = orm_clinet:get_one_entry(account)
if not account_info then
return nil, CODE.NOT_USER, "NOT_USER"
end

password = crypt_util.HMAC.SHA256(password, crypt.base64decode(account_info.key))
if account_info.password ~= password then
return nil, CODE.ERR_PASSWORD, "ERR_PASSWORD"
end
--log.info("auth >>>>> :", account_info)
account_info.last_login_time = time_util.time()
orm_clinet:change_save_one_entry(account_info)
return true, account_info.player_id, account_info.hall_server_id
end
1
2
3
4
5
6
7
8
9
--注册
function M.register(account_info, channel)
local cli = frpc_client:instance("centerserver", "account_m")
cli:set_mod_num(sbyte(account_info.account, account_info.account:len()))
local ret = cli:one_mod_call("register", account_info, channel)
if not ret then return end

return table.unpack(ret.result)
end

成功后,进入到流程3通知大厅服为该玩家创建登录的token。

流程3

涉及skynet_fly技术

* cluster rpc

涉及服务

* loginserver
* hallserver

通过rpc_hall_player.create_token(player_id, ENUM.LOGIN_TOKEN_TIME_OUT)调用得到token

流程4

涉及skynet_fly技术

* cluster rpc

把得到的token返回给客户端。

流程5

涉及skynet_fly技术

* ws gate

客户端拿到hallserver的连接host和token通过ws 建立连接,进行登录,hallserver收到登录消息,进去token验证

流程6

验证通过返回登录成功


用户是如何登录的?
https://huahua132.github.io/2023/05/03/skynet_fly_word/word_4/C_q/
作者
huahua132
发布于
2023年5月3日
许可协议