2019-04-29 18:25:50 2030次浏览 3条回答 0 悬赏 80 金钱

我现在是使用yii登陆机制,在登陆成功以后客户端再开启websocket服务,进行连接,连接之后websocket触发open,我在连接成功时在服务器进行登陆用户和fd的映射,但是我使用 Yii::$app->user->identity 始终报错,难道swoole破坏了cooie机制???还是因为yii组件根本没启动如果是因为没启动,我使用测试数据测试验证密码问题 Yii::$app->getSecurity()->validatePassword('123456',$user->password_hash) ,swoole并没有中断报错,很费解。请教一下,或者说你们在做web im的时候这一块是咋么处理的

最佳答案

  • immusen 发布于 2019-04-29 23:33 举报

    Yii::$app->user->identity 里的 user 默认是 yii\web\user
    在swoole的worker里面运行的话:一般的做法是重写 yii\web\user的login 方法,改成不依赖cookie(至于依赖什么,得看你在websocket登录的解决方案,有各种变通、组合方案,说来话长),然后确保在你 Yii::$app->user->identity 之前调用过login;
    中级做法是uid绑fd,然后根据业务需求拿uid操作缓存、数据库;
    高级的做法是用swoole会话期对象在会话期保持机制...
    还挺好玩儿的..改天我做一个Demo..

    1 条回复
    回复于 2019-04-30 09:58 回复

    比如现在我用token来验证用户,服务器端开启监听端口,客户端先进行用户认证,认证成功,那我客户端开启一个websocket服务,当他开启服务的时候,端和端之间三次握手,建立连接,这个连接是在内核中完成的。和应用层没有关系,如果用户认证使用的是token,那我应该是在连接还未完成时进行token认证,我还需要进行fd和用户的关系映射,fd是在连接完成,生成一个用于之后的所有关于消息广播等等。问题就是我们根本不用关注他的三次握手以及连接,你说的uid和fd的绑定是在哪个流程中,连接的时候我们并没有传递用户信息啊,连接的过程对我们来说是空白的

  • 回答于 2019-04-29 21:50 举报

    大佬弃坑的时候 来这说下

  • 回答于 2019-04-30 13:37 举报

    swoole的websocket握手有默认机制,但你也是能有机会附加操作的(onHandShake回调中,你一样能像HTTP那样加自定义Header或者path_info的方式携带额外数据),这是你可以验证用户身份的第一次时机;
    第二次时机,连接成功后,客户端用你自己约定的方式发token给服务器(rpc、json....),完成验证(Who am i)。
    验证后绑定:$server->bind($fd,$uid)绑到connection_info上,之后随时能$Server->getClientInfo()取回uid。

    1 条回复
    回复于 2019-04-30 16:52 回复

    这一块已经明白了,客户端在请求转换ws协议是基于http(这个连接的过程我就可以携带参数过去了),请求报文中携带了Upgrade参数,只要服务器支持当前服务,服务器先把自身切换至sw服务,接着response成功的标示。客户端和服务器端连接成功。首先先感谢老哥的回答。

    还有一个问题就是,我做了fd和uid的绑定,但是我刷新一次客户端就相当于重新触发了一次onopen,那么当前的fd又改变了,fd自增,之前哪个fd其实还存在进程中的,只有当onclose的时候才会被关闭。那么问题是刷新一次客户端当前用户和fd的映射岂不是不存在了,因为fd改变了。

    再次感谢老哥的回答。

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
wuqinqiang
见习主管

wuqinqiang

注册时间:2018-09-16
最后登录:2023-11-21
在线时长:34小时11分
  • 粉丝4
  • 金钱100
  • 威望0
  • 积分440

热门问题