workerman应该如何实现授权?

授权设想:#

用户在 web 里登录操作成功后,把 token 返回给前端。前端建立 ws 链接时把 token 传到 ws 服务器
通过 token 查询用户信息,绑定用户 id,不知道是否合理?

服务端用的是 passport,前端通过 ws 传 token 应该如何验证获取用户 id

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 34

jwt 根据相应规则解密就行了啊

2年前 评论

在握手的时候进行验证并绑定用户不就行了嘛?

2年前 评论
臭鼬 (楼主) 2年前

在建立连接的时候验证就行了吧

2年前 评论

我们就比较流氓了,web_api 的 session 驱动直接改成 redis,workerman 这边拿登录信息直接去 redis 拿

2年前 评论

绑定 uid 就行了 文档上面已经说的很清楚了 不要想得太复杂 什么 jwt 解密这些都没有必要 混乱试听的。

2年前 评论
臭鼬 (楼主) 2年前

两种方式:

  1. 连接成功后发送授权信息进行验证
  2. 通过 ws://xxx.com?token=xxx 传授权参数
2年前 评论
臭鼬 (楼主) 2年前
Neilyozの鱼不浪 2年前
wmhello 2年前
yzbfeng 2年前
wmhello 2年前
yzbfeng 2年前
wmhello 2年前
yzbfeng 2年前
wmhello 2年前
yzbfeng 2年前
wmhello 2年前
wmhello 2年前
臭鼬 (楼主) 2年前
景色铅华 2年前

:sweat_smile:

方式一:我一般直接把 workerman 当做一个推送工具来用 你是请求层面直接发送到 workerman 的 service 了看这个图你可以在 laravel 请求层面 再去绑定 getwayworker (官方推介用法)

方式二: ws://xxx.com?token=xxx 传授权参数 获取到授权参数你再去跑个 http 请求 请求 laravel 那边拿这个 uid

file

2年前 评论
臭鼬 (楼主) 2年前
ysxpark 2年前
臭鼬 (楼主) 2年前

passport 解码问题这个 链接 看这个能不能解决,
如果不能,可以迂回处理一下,配置一个鉴权接口,通过 token 获取用户信息,websocket 接收到 token,去请求这个鉴权接口返回用户信息拿到 user_id

2年前 评论
kkokk (作者) 2年前
臭鼬 (楼主) 2年前

你这个场景我之前做直播的时候写过,但是我不明白你这个是什么问题。我没用过 passport,如果你的疑问是在 workerman 里面不能使用 passport 的话,可以在缓存内建立联系。

2年前 评论

所以你的问题也不是在 workerman 了,你是不知道如何拿 token 换 uid

2年前 评论
臭鼬 (楼主) 2年前

难道正确的情况不是 链接的时候带上 token 么? 类似 ws://xxx.com?token=token 后端可以拿到 query 的。直接 auth 就可以了。。。。

2年前 评论
    /**
     * 根据传递的 bearerToken 获取已授权用户id
     *
     * @param $bearerToken
     * @return null
     */
    protected function getAuthUserId($bearerToken)
    {
        $header = data_get(explode('.', $bearerToken), 1);
        $acTokenId = data_get(json_decode(base64_decode($header), true), 'jti');
        $acToken = $acTokenId
            ? Passport::token()->where('client_id', config('admin.client_id'))->where('revoked', false)->find($acTokenId)
            : null;

        if (empty($acToken)) {

            gateway('admin')->closeClient($this->clientId, 'token 无效');
            return;
        }
        if ($this->acTokenExpired($this->acToken)) {

            gateway('admin')->closeClient($this->clientId, 'token 已过期');
            return;
        }

        return $acToken->user_id;
    }
2年前 评论