This commit is contained in:
Cloud Wu
2014-07-13 21:02:23 +08:00
parent e963ee6aba
commit 0d1c3a64d1
5 changed files with 63 additions and 35 deletions

View File

@@ -14,7 +14,6 @@ package.cpath = "luaclib/?.so"
]]
local socket = require "clientsocket"
local cjson = require "cjson"
local crypt = require "crypt"
local last
@@ -61,7 +60,14 @@ local token = {
pass = "password",
}
local etoken = crypt.desencode(secret, cjson.encode(token))
local function encode_token(token)
return string.format("%s@%s:%s",
crypt.base64encode(token.user),
crypt.base64encode(token.server),
crypt.base64encode(token.pass))
end
local etoken = crypt.desencode(secret, encode_token(token))
local b = crypt.base64encode(etoken)
socket.writeline(fd, crypt.base64encode(etoken))

View File

@@ -1,5 +1,4 @@
local login = require "gamefw.loginserver"
local json = require "cjson"
local crypt = require "crypt"
local skynet = require "skynet"
@@ -12,32 +11,51 @@ local server = {
local server_list = {}
local user_online = {}
local server_mt = {}
server_mt.__index = server_mt
function server_mt:kick(uid)
skynet.call(self.address, "lua", "kick", self.name, uid)
end
function server_mt:login(uid, secret)
skynet.call(self.address, "lua", "login", self.name, uid, secret)
end
function server.auth_handler(token)
token = json.decode(token)
assert(token.user)
assert(token.pass == "password")
return token.server, token.user
-- the token is base64(user)@base64(server):base64(password)
local user, server, password = token:match("([^@]+)@([^:]+):(.+)")
user = crypt.base64decode(user)
server = crypt.base64decode(server)
password = crypt.base64decode(password)
assert(password == "password")
return server, user
end
function server.login_handler(server, uid, secret)
print(string.format("%s@%s is login, secret is %s", uid, server, crypt.hexencode(secret)))
local u = user_online[uid]
if u then
local gameserver = server_list[u.server]
skynet.call(gameserver, "lua", "kick", server, uid)
u:kick(uid)
end
local gameserver = assert(server_list[server])
skynet.call(gameserver, "lua", "login", server, uid, secret)
assert(user_online[uid] == nil, "kick failed")
local gameserver = assert(server_list[server], "Unknown server")
gameserver:login(uid, secret)
user_online[uid] = gameserver
end
local CMD = {}
function CMD.register_gate(source, name)
server_list[name] = source
function CMD.register_gate(server, address)
server_list[server] = setmetatable( { name = server, address = address }, server_mt )
end
function CMD.logout(source, uid, server)
print(string.format("%s@%s is logout", uid, server))
function CMD.logout(uid)
local u = user_online[uid]
if u then
print(string.format("%s@%s is logout", uid, u.name))
user_online[uid] = nil
end
end
function server.command_handler(command, source, ...)

View File

@@ -140,7 +140,7 @@ handler.error = handler.close
function handler.open(source, conf)
login_master = assert(conf.loginserver)
local servername = assert(conf.servername)
skynet.call(login_master, "lua", "register_gate", servername)
skynet.call(login_master, "lua", "register_gate", servername, skynet.self())
end
@@ -162,7 +162,7 @@ end
function CMD.logout(source)
local c = agent[source]
if c then
skynet.call(login_master, "lua", "logout", c.server, c.uid)
skynet.call(login_master, "lua", "logout", c.uid)
if c.fd then
gateserver.closeclient(c.fd)
end