Laravel中$response->headers->set为什么无效果?

发布于 2022-09-11 15:01:06 字数 2008 浏览 18 评论 0

准备开发小程序,先测试后台API,项目使用Laravl+jwt+dingo来开发,JWT想要实现无痛刷新token,测试过程中在网上找到这样的一个中间件

    public function handle($request, Closure $next)
    {
        // 检查此次请求中是否带有 token,如果没有则抛出异常。 
        $this->checkForToken($request);

       // 使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException  异常
        try {
            // 检测用户的登录状态,如果正常则通过
            if ($this->auth->parseToken()->authenticate()) {
                return $next($request);
            }
            throw new UnauthorizedHttpException('jwt-auth', '未登录');
        } catch (TokenExpiredException $exception) {
          // 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中
            try {
                // 刷新用户的 token
                $token = $this->auth->refresh();
               // 使用一次性登录以保证此次请求的成功
                Auth::guard('api')->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()['sub']);
            } catch (JWTException $exception) {
               // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。
                throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage());
            }
        }
        
        // 在响应头中返回新的 token
        return $this->setAuthenticationHeader($next($request), $token);
    }

在postman中测试接口,每次请求完后响应header都没办法添加authorization
$this->setAuthenticationHeader这个源码是:

    protected function setAuthenticationHeader($response, $token = null)
    {
        $token = $token ?: $this->auth->refresh();
        $response->headers->set('Authorization', 'Bearer '.$token);

        return $response;
    }

$response->headers->set('Authorization', 'Bearer '.$token);这里无法添加,这是为什么?
最后改用这样才可以:

        return $next($request)->withHeaders([
                'Authorization'=> 'Bearer '.$token,
            ]);

按理说dingo自带的方法应该不会有问题的,是我哪里出错了吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

捎一片雪花 2022-09-18 15:01:06

laravel并不是这样设置header的。
你要用header($key,$val),可以连续多个调用 或者用withHeaders()

浪漫人生路 2022-09-18 15:01:06

...你可以再检查一下代码.首先这样设置headers是没问题的。看你的代码太复杂了, 太多种情况。姑且猜测是因为 throw exception 导致 laravel 重新make 了response 导致headers的覆盖?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文