def requestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG('requestAccountLogin: registerName=%s' % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # tornado异步访问。也可以结合socket模拟http的方式与平台交互。 KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_SUCCESS)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG("onRequestAccountLogin: registerName=%s" % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # tornado异步访问。也可以结合socket模拟http的方式与平台交互。 # 如果返回码为KBEngine.SERVER_ERR_LOCAL_PROCESSING则表示验证登陆成功,但dbmgr需要检查账号密码,KBEngine.SERVER_SUCCESS则无需再检查密码 KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG('onRequestAccountLogin: registerName=%s' % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # tornado异步访问。也可以结合socket模拟http的方式与平台交互。 # 如果返回码为KBEngine.SERVER_ERR_NEED_CHECK_PASSWORD则表示验证登陆成功,但dbmgr需要检查账号密码,KBEngine.SERVER_SUCCESS则无需再检查密码SERVER_ERR_LOCAL_PROCESSING KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG('onRequestAccountLogin: registerName=%s' % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.urlopen("https://www.baidu.com",onHttpCallback)异步访问。也可以结合异步socket的方式与平台交互(参考Poller.py)。 # 如果返回码为KBEngine.SERVER_ERR_LOCAL_PROCESSING则表示验证登陆成功,但dbmgr需要检查账号密码,KBEngine.SERVER_SUCCESS则无需再检查密码 KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING)
def requestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG('requestAccountLogin: registerName=%s' % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_SUCCESS)
def onRequestAccountLogin(loginName, password, datas): commitName = loginName realAccountName = loginName #wetchat = '%d' % GameConfigs.WECHAT_GAME #param = eval(datas.decode('utf8')) #isWeiXinLogin = False # callback = lambda _commitName, _realAccountName, _datas, _result:{ # KBEngine.accountLoginResponse(_commitName, _realAccountName, _datas, _result) # } # g_LoginPoller.wxLogin(loginName, callback) #if param["platform"] == wetchat: # callback = lambda _commitName, _realAccountName, _datas, _result:{ # KBEngine.accountLoginResponse(_commitName, _realAccountName, _datas, _result) # } # g_LoginPoller.wxLogin(loginName, callback) #else: # KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) # if param["platform"] == wetchat: # values = {} # values['appid'] = GameConfigs.APPID # values['secret'] = GameConfigs.APP_SECRET # values['js_code'] = loginName # values['grant_type'] = 'authorization_code' # query_string = parse.urlencode(values) # #构建微信接口URL: https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code # url = GameConfigs.WEI_XIN_URL + "?" + query_string # try: # DEBUG_MSG("visist wei xin server ....") # #阻塞同步访问,大量用户访问时,会造成性能下降,建议使用异步访问 # #向微信服务器请求session_key和openid # start = time.clock() # respone = request.urlopen(url).read().decode("utf8") # end = time.clock() # DEBUG_MSG("visit weixin time %f" % (end - start)) # userInfo = eval(respone) # if respone: # isWeiXinLogin = True # realAccountName = userInfo["openid"] # datas = str(userInfo).encode() # except Exception as err: # isWeiXinLogin = False # DEBUG_MSG("weixin Error: " + str(err)) # if not isWeiXinLogin: # datas = bytes() KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING)
def __getUserCallBack(loginName, password, clientData, httpcode, data, headers, success, url): """ 参数1:HTTP请求返回码 这个结果集合参数是一个整形值 参数2:返回的内容 它是一个字符串 参数3:服务器返回的HTTP协议头,如:{"Content-Type": "application/x-www-form-urlencoded"} 它是一个字典 参数4:执行是否成功,当请求执行有错误时为False 可以通过httpcode进一步判断错误信息 参数5:请求所用的网址 """ INFO_MSG('__getUserCallBack: loginName=%s, httpcode=%s, success=%s' % (loginName, httpcode, success)) # 如果获取微信信息失败 if not success: KBEngine.accountLoginResponse(loginName, loginName, clientData, KBEngine.SERVER_ERR_USER1) return # 数据转换 data = GTools.json_load(data) # 获取用户信息失败 if 'errcode' in data and data['errcode'] != 0: ERROR_MSG('__getUserCallBack: data=%s' % (data)) KBEngine.accountLoginResponse(loginName, loginName, clientData, KBEngine.SERVER_ERR_USER1) return # 检查加密数据 key = GTools.getSha1Str(GTools.byteToStr(clientData) + data['session_key']) ERROR_MSG("clientData(%s) session_key(%s) key(%s) password(%s)" % (clientData, data['session_key'], key, password)) if key == password: INFO_MSG("__getUserCallBack::SERVER_SUCCESS. loginName=%s, openid=%s" % (loginName, data['openid'])) KBEngine.accountLoginResponse(loginName, data['openid'], clientData, KBEngine.SERVER_SUCCESS) else: ERROR_MSG("__getUserCallBack::SERVER_ERR_NAME_PASSWORD. loginName=%s, openid=%s" % (loginName, data['openid'])) KBEngine.accountLoginResponse(loginName, loginName, clientData, KBEngine.SERVER_ERR_NAME_PASSWORD)
def processData(self): """ 处理接收数据 从接收数据中截取json串并解析 """ _index1 = self._recv_str.find('{') _index2 = self._recv_str.rfind('}') _bodyStr = self._recv_str[_index1:_index2 + 1] DEBUG_MSG("_bodyStr: %s" % _bodyStr) self._recv_data = json.loads(_bodyStr) DEBUG_MSG("self._recv_data: %s" % str(self._recv_data)) KBEngine.accountLoginResponse('chongxin', 'chongxin', KBEngine.SERVER_ERR_LOCAL_PROCESSING)
def callback(response): serverData = {} realAccountName = loginName if response.code == 200: user_data = AsyncHttp.parse_json(response.body) pk = user_data.pop("pk", None) if pk: realAccountName = str(pk) code = KBEngine.SERVER_SUCCESS else: code = KBEngine.SERVER_ERR_NAME_PASSWORD serverData = user_data else: code = KBEngine.SERVER_ERR_OP_FAILED KBEngine.accountLoginResponse(loginName, realAccountName, Bytes(**serverData).dumps(), code)
def onRequestAccountLogin(loginName, password, datas): commitName = loginName realAccountName = copy.deepcopy(commitName) wetchat = '%d' % GameConfigs.WECHAT_GAME isWeiXinLogin = False param = eval(datas.decode('utf8')) if param["platform"] == wetchat: callback = lambda _commitName, _realAccountName, _datas, _result: { KBEngine.accountLoginResponse(_commitName, _realAccountName, _datas, _result) } g_LoginPoller.wxLogin(loginName, callback) else: KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) """
def onRequestAccountLogin(loginName, password, datas): commitName = loginName if loginName.find('yk') != -1: realAccountName = commitName #生成账号 if len(loginName) == 2: UUID = KBEngine.genUUID64() commitName = 'yk' realAccountName = 'yk' + str(UUID) INFO_MSG('游客登录: loginName=%s,commitName=%s,realAccountName=%s' % (loginName, commitName, realAccountName)) KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) else: #http请求,跟第三方平台对接登录 callback = lambda _commitName, _realAccountName, _datas, _result: { KBEngine.accountLoginResponse(_commitName, _realAccountName, _datas, _result) } g_LoginPoller.ZLLogin(loginName, password, datas, callback)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ INFO_MSG('onRequestAccountLogin: registerName=%s' % (loginName)) commitName = loginName # 默认账号名就是提交时的名 realAccountName = commitName # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # tornado异步访问。也可以结合socket模拟http的方式与平台交互。 # 如果返回码为KBEngine.SERVER_ERR_LOCAL_PROCESSING则表示验证登陆成功,但dbmgr需要检查账号密码,KBEngine.SERVER_SUCCESS则无需再检查密码 if "test" in commitName: KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) else: import urllib.request as urllib import json print(urllib) res = json.loads( urllib.urlopen( "http://ncf.cz-studio.cn/check-user/?user_email={user}&user_password={pw}" .format(user=loginName, pw=password)).read().decode('utf-8')) if res['passport'] == "1": realAccountName = res['username'] if res['usertype'] in ["8", "9"]: KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_SUCCESS) else: KBEngine.accountLoginResponse( commitName, realAccountName, datas, KBEngine.SERVER_ERR_ACCOUNT_NOT_ACTIVATED) else: KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_NAME_PASSWORD)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 - 微信登陆获得的code @type loginName: string @param password: 密码 - sha1( datas + sessionkey ) @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 - 用户信息字符串 @type datas: bytes """ INFO_MSG('onRequestAccountLogin: loginName=%s' % (loginName)) # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # KBEngine.urlopen("https://www.baidu.com",onHttpCallback)异步访问。也可以结合socket的方式与平台交互。 # 如果返回码为KBEngine.SERVER_ERR_LOCAL_PROCESSING 则表示验证登陆成功,但dbmgr需要检查账号密码 # KBEngine.SERVER_SUCCESS 则无需再检查密码 loginNameList = loginName.split(':') # 0 登陆方式为账号登陆 if loginNameList[0] == '0': KBEngine.accountLoginResponse(loginName, loginName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) # 1 登陆方式为微信登陆 elif loginNameList[0] == '1': # 换取用户唯一标识 OpenID 和会话密钥 session_key url = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code" \ % (GServerCfg.GC_APPInfo['appID'], GServerCfg.GC_APPInfo['AppSecret'], loginNameList[1]) KBEngine.urlopen(url, GTools.functor(__getUserCallBack, loginName, password, datas))
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ data = Bytes(datas) if not settings.Account.needWebAuth: return KBEngine.accountLoginResponse( loginName, data.get("username", loginName), Bytes(username=loginName, password=loginName, typeList=[]).dumps(), KBEngine.SERVER_SUCCESS) def callback(response): serverData = {} realAccountName = loginName if response.code == 200: user_data = AsyncHttp.parse_json(response.body) pk = user_data.pop("pk", None) if pk: realAccountName = str(pk) code = KBEngine.SERVER_SUCCESS else: code = KBEngine.SERVER_ERR_NAME_PASSWORD serverData = user_data else: code = KBEngine.SERVER_ERR_OP_FAILED KBEngine.accountLoginResponse(loginName, realAccountName, Bytes(**serverData).dumps(), code) AsyncHttp().post(settings.Account.url.authUser, callback, data)
def onRequestAccountLogin(loginName, password, datas): """ KBEngine method. 请求登陆账号回调 @param loginName: 客户端请求时所提交的名称 @type loginName: string @param password: 密码 @type password: string @param datas: 客户端请求时所附带的数据,可将数据转发第三方平台 @type datas: bytes """ commitName = loginName INFO_MSG('onRequestAccountLogin: loginName=%s' % (loginName)) INFO_MSG('onRequestAccountLogin: commitName=%s' % (commitName)) INFO_MSG(datas) # 默认账号名就是提交时的名 realAccountName = copy.deepcopy(commitName) wetchat = '%d' % GameConfigs.WECHAT_GAME code = None IsWeiWinLogin = False param = datas.decode() params = param.split('&') INFO_MSG(params) isWeiXinLogin = False if params and len(params) >= 2: param1 = params[0].split('=') param2 = params[1].split('=') if param1[0] == 'platform' and param1[1] == wetchat and param2[ 0] == 'code' and param2[1] != 'null': code = param2[1] values = {} values['appid'] = GameConfigs.APPID values['secret'] = GameConfigs.APP_SECRET values['js_code'] = code values['grant_type'] = 'authorization_code' query_string = parse.urlencode(values) url = GameConfigs.WEI_XIN_URL + "?" + query_string try: INFO_MSG("vist weixin : " + url) #阻塞同步访问,大量用户访问时,会造成性能下降,建议使用异步访问 respone = request.urlopen(url).read().decode("utf8") userInfo = eval(respone) INFO_MSG("wei_xin_server respone= " + respone) INFO_MSG(userInfo) isWeiXinLogin = True if respone: sessionId = get3rdSession(respone) realAccountName = userInfo["openid"] if not sessionId in g_3rdSession: g_3rdSession[sessionId] = userInfo userInfo['3rdSessionId'] = sessionId datas = str(userInfo).encode() INFO_MSG(datas) except Exception as err: isWeiXinLogin = False INFO_MSG("weixin Error: " + str(err)) # 此处可通过http等手段将请求提交至第三方平台,平台返回的数据也可放入datas # datas将会回调至客户端 # 如果使用http访问,因为interfaces是单线程的,同步http访问容易卡住主线程,建议使用 # KBEngine.registerReadFileDescriptor()和KBEngine.registerWriteFileDescriptor()结合 # tornado异步访问。也可以结合socket模拟http的方式与平台交互。 # 如果返回码为KBEngine.SERVER_ERR_LOCAL_PROCESSING则表示验证登陆成功,但dbmgr需要检查账号密码,KBEngine.SERVER_SUCCESS则无需再检查密码 if not isWeiXinLogin: INFO_MSG("Clear datas") datas = bytes() KBEngine.accountLoginResponse(commitName, realAccountName, datas, KBEngine.SERVER_ERR_LOCAL_PROCESSING) INFO_MSG("accountLoginResponse, data:") INFO_MSG(datas)