websocket服务器跟业务服务器分开部署 不需要登录就能聊天 如何防止伪造身份
我的思路如下 但是不知道对不对 大家帮忙看看
当用户第一次访问业务服务器的时候 根据session随机生成一个用户名 然后生成一个token 将用户名跟token的关系保存到数据库
然后把用户名以及token发给用户的浏览器 然后浏览器带上用户名以及token 访问websocket服务器的登录接口
websocket服务器根据用户名去数据库查找token 如果跟传过来token的一致 就允许登录然后把用户信息保存到websocket服务器的session里面 这样用户以后每次发消息的时候直接读取websocket里面的用户名 就知道这个消息是谁发过来的
最后一句补充下 这样用户以后每次发消息的时候直接读取websocket服务器的session里的用户名 就知道这个消息是谁发过来的
补充说明 经过我验证GatewayWorker不支持session 那么只能在登录的时候绑定clientid跟用户名的关系
下次发消息的时候根据clientid来查找出用户名 由此来得的是谁发的消息
在次补充 上面说的有问题 希望对相关人员有帮助 测试发现GatewayWorker 支持session 的 但是跟传统的session不一样 例如下面的例子
每次刷新浏览器后都会重新生成 (传统浏览器session刷新是不会重新生成的) 但是不刷新的这段时间内 里面的值是一直存在的 所以可以通过他来判断用户是否登录过 这个session说白了就是一个所有用户都能访问的全局数组
是的,GatewayWorker支持SESSION,不过是自己的一套机制,GatewayWorker手册有详细介绍。
如何验证身份,我的做法是web(我用的是tp)登录的时候,向redis存一个数据,可以就是session_id,value是用户信息。
浏览器连接上GatewayWorker后发送login请求(请求里包含session_id),GatewayWorker(Events.php的onMessage)收到login请求,提取session_id去redis查用户是谁,然后利用Gateway::bind($client_id, $uid);接口绑定,设置下session,$_SESSION=xxx。