AnyChat技术支持论坛

标题: 有关AnyChat平台用户身份验证与第三方平台集成的问题 [打印本页]

作者: admin    时间: 2013-6-21 10:15
标题: 有关AnyChat平台用户身份验证与第三方平台集成的问题
AnyChat采用独立业务逻辑服务器来处理有关业务相关的事务,其中用户身份验证就属于其中一个业务逻辑的处理。首先看一下AnyChat平台业务逻辑处理的总体框架,如下图所示:

其中,BusinessServer.exe是一个独立的应用程序,调用AnyChat Server SDK所提供的API接口,AnyChat Server SDK内部会采用IPC的方式与核心服务器建立联系,即:在处理业务逻辑时,不需要与核心服务器(AnyChatCoreServer.exe)建立直接的联系,核心服务器也不提供任何API接口供调用。
用户在AnyChat平台登录时,分两种情况:游客方式(只有用户名,密码为空)和正常方式(用户名、密码均不为空),下面分别对这两种方式的业务流程进行详细描述:

a)游客方式:在调用客户端API接口【BRAC_Login】时只传入用户名,密码为空,则核心服务器(AnyChatCoreServer.exe)将分配一个userid,为负数,从-2开始依次加1,同时触发业务服务器的回调事件【OnUserLoginAction】,如下图所示:

可以在核心服务器的配置文件(AnyChatCoreServer.ini)中进行配置,开启(默认)或关闭游客登录模式。


b)正常方式:在调用客户端API接口【BRAC_Login】时传入用户名和密码,均不为空,则核心服务器(AnyChatCoreServer.exe)将不处理userid的分配逻辑,将会触发业务服务器的回调事件【OnVerifyUser】,由业务服务器在该回调事件中进行用户身份验证,分配userid,然后将用户身份验证结果(是否登录成功)返回给客户端,若用户身份验证成功,则还将触发业务服务器的回调事件【OnUserLoginAction】,如下图所示:


在业务服务器【OnVerifyUser】回调函数中,所分配的userid,返回的errorcode,将体现在客户端的事件【OnLoginSystem(userid, errorcode)】参数中,所以业务服务器可以自定义errorcode来表示用户身份验证失败的原因。


关于数据库连接:核心服务器(AnyChatCoreServer.exe)是不需要连接数据库的,连接数据库在业务层处理,即由业务服务器自己连接数据库,在【OnVerifyUser】回调函数中查询数据库的信息,对用户身份进行验证,所以不论上层应用是连接的MSSQL、MySQL、DB2、Oracle或是NoSQL,对AnyChat平台来说,都是透明的。

常见问题分析:
1、用户登录时不能触发业务服务器的【OnVerifyUser】回调函数?
答:是否在登录时输入的密码为空?

2、用户登录时不能触发业务服务器的【OnUserLoginAction】回调函数?
答:是否正确部署了业务服务器,业务服务器是否与核心服务器建立了正常的通信联系?参考:AnyChat使用攻略之独立部署Windows视频服务器

3、用户登录时输入了用户名、密码,为什么返回的userid还是负数,还是游客模式登录?
答:这是核心服务器内置的业务逻辑,当业务服务器没有启动,或是业务服务器部署不正确时将默认以游客方式登录系统,参考:AnyChat核心服务器内置用户登录业务逻辑





作者: admin    时间: 2013-6-21 11:41
除了采用独立进程的业务服务器(BusinessServer.exe)来实现业务逻辑处理,AnyChat还支持一种更简洁的“SDK Filter Plus”工作模式,如下图所示:


将业务逻辑封装在一个动态库中供核心服务器(AnyChatCoreServer.exe)调用。有关SDKFilterPlus的示例源代码可以在AnyChat for Windows SDK的【src\server\c++\SDKFilterPlus】目录下找到。
编译好动态库之后,在核心服务器配置文件(AnyChatCoreServer.ini)中进行配置:
  1. [Function Settings]
  2. SDKFilterPlus=SDKFilterPlus.dll
复制代码
然后保存配置文件,将编译好的动态库(SDKFilterPlus.dll,Linux下为:SDKFilterPlus.so)拷贝到服务器程序所在的当前目录下,最后重启核心服务器程序即可,会在核心服务器的日志文件(AnyChatCoreServer.log)中输出相关的加载信息。



作者: admin    时间: 2013-6-21 12:02
若在AnyChat之外已经进行了一次用户身份验证,只是希望用AnyChat实现流媒体通信服务,而且不希望在业务服务器(BusinessServer.exe)上设计得太复杂,不希望连接数据库,则可以通过如下的方式巧妙的回避AnyChat的登录流程,而且还可保持userid与第三方平台一致。

如果在第三方平台上用户身份验证之后,获得的userid为108,则可以将userid转换为字符串“108”进行AnyChat平台登录,密码可以用任意字符串代替,不为空即可,如:BRAC_Login("108", "demo", 0);

在业务服务器的【OnVerifyUser】回调函数中将username字符串转换为整型值,传给userid,同时返回0即可。
  1. // 用户身份验证回调函数定义
  2. DWORD CALLBACK VerifyUserCallBack(LPCTSTR lpUserName,LPCTSTR lpPassword, LPDWORD lpUserID, LPDWORD lpUserLevel, LPTSTR lpNickName,DWORD dwNCLen, LPVOID lpUserValue)
  3. {
  4.     *lpUserID = atoi(lpUserName);
  5.     return 0;
  6. }
复制代码
这样在客户端的登录消息【OnLoginSystem(userid=108, errorcode=0)】就是第三方平台的userid了。
作者: lincy    时间: 2014-11-28 10:42
请问,客户登录后业务服务器是否可以自动创建和分配房间?
作者: lincy    时间: 2014-11-28 10:44
有没有相关的API可供使用?
作者: admin    时间: 2014-11-28 10:54
关于房间,请参考:http://bbs.anychat.cn/forum.php?mod=viewthread&tid=86
作者: lincy    时间: 2014-11-28 10:58
admin 发表于 2014-11-28 10:54
关于房间,请参考:http://bbs.anychat.cn/forum.php?mod=viewthread&tid=86

好的,谢谢
作者: liaoyoli    时间: 2015-1-27 00:58
hh呵呵呵呵呵
作者: z289674881    时间: 2015-6-30 21:20
程序有没有电子白板功能呢?
作者: 佰锐科技-邵光清    时间: 2015-7-1 09:04
z289674881 发表于 2015-6-30 21:20
程序有没有电子白板功能呢?

您好,我们提供有相关的接口,可以利用桌面共享的接口去实现电子白板的功能的。
作者: iusure    时间: 2018-3-24 22:49
admin 发表于 2013-6-21 12:02
若在AnyChat之外已经进行了一次用户身份验证,只是希望用AnyChat实现流媒体通信服务,而且不希望在业务服务 ...

请问这个逻辑在java里边怎么实现呢?
作者: 陈鑫    时间: 2018-3-26 11:32
实现思路简化版:
客户端登陆API,发送用户信息 --- 核心服务转发ID和密码 --- 业务服务器验证(验证方法自行设计),返回用户身份验证回调函数 --- 核心转发回调 --- 客户端通过验证后登陆。
用户身份验证回调函数说明:
2.3.  用户身份验证回调函数定义
typedef DWORD (CALLBACK* BRAS_VerifyUser_CallBack)(IN LPCTSTR lpUserName,INLPCTSTR lpPassword, OUT LPDWORD lpUserID, OUT LPDWORD lpUserLevel, OUT
LPTSTR lpNickName,IN DWORD dwNCLen, LPVOID lpUserValue);
参数:
LPCTSTR  lpUserName 用于身份验证的用户名
LPCTSTR  lpPassword 用于身份验证的用户密码
LPDWORD lpUserID  输出用户的 ID 号(唯一)
LPDWORD lpUserLevel 输出用户的级别
LPTSTR lpNickName 输出用户的昵称(可以与用户名相同)
DWORD dwNCLen  保存用户昵称的缓冲区大小
LPVOID  lpUserValue 用户自定义参数,在设置回调函数时传入
返回值:
DWORD  返回出错代码,参考 SDK\ GVErrorCodeDefine.h 文件中有关出错
代码的定义,通常会返回如下的值:
GV_ERR_SUCCESS(0)  表示验证通过,允许用户登录系统
GV_ERR_CERTIFY_FAIL(200) 用户名或密码有误,认证失败
GV_ERR_ACCOUNT_LOCK(202)  帐户已被暂时锁定,认证失败
备注:
该回调函数用于验证用户的身份信息。用户名与用户密码为输入参数,后面其它的参数为输出参数,用于反馈结果给服务器程序。身份验证是否成功通过该
方法的返回值来判定。dwVSLen 用于指示传入的缓冲区大小,防止函数体里面拷贝数据时内存溢出。如果该方法不输出用户的昵称,即当 lpNickName 的字符
长度为 0 时,服务器会自动将用户名默认为用户的昵称。
当客户端调用 API:“BRAC_Login”方法,且用户密码不为空时将会触发该回调函数,如果用户密码为空,则不会触发该回调,服务器会将该客户端当“游
客身份”进行处理,如果服务器不支持游客方式登录,则将会返回对应的出错代码给客户端。
该回调仅仅做为用户身份验证之用,不能在该回调里面调用其它的 API(如向指定用户传输透明通道数据:BRAS_TransBuf 等),因为该回调没有返回之前,
用户在内核就没有与 USERID 进行绑定,所以这时调用其它的 API 将是无效的,如 需 要 在 用 户 登 录 之 后 就 发 送 一 些 数 据 , 则 可 在
BRAS_OnUserLoginAction_CallBack 回调函数里面进行处理。
作者: 陈鑫    时间: 2018-3-26 11:42
最简单的验证方法是,业务服务器收到核心转发的用户信息后,去DB用户表里面检索,匹配成功后,返回回调函数和用户ID给核心,核心传给客户端,通过验证。




欢迎光临 AnyChat技术支持论坛 (http://bbs.anychat.cn/) Powered by Discuz! X3