Laravel中$response->headers->set为什么无效果?
准备开发小程序,先测试后台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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
laravel并不是这样设置header的。
你要用header($key,$val),可以连续多个调用 或者用withHeaders()
...你可以再检查一下代码.首先这样设置headers是没问题的。看你的代码太复杂了, 太多种情况。姑且猜测是因为 throw exception 导致 laravel 重新make 了response 导致headers的覆盖?