Laravel Passport令牌传递异常:前端请求返回Unauthenticated错误
问题分析与解决方案
这种情况我碰到过好多次,核心问题几乎都是你从session里取到的access_token和Postman里的有效令牌不一致,咱们一步步排查:
1. 先确认Session中的令牌是否有效
最直接的方式是在代码里先打印出$accessToken,对比Postman里的令牌是否完全一致:
public function global_Curl_Post($data , $url) { $server = env('API_ENDPOINT_NGINX_NAME') ?? 'https://digitalapps*****.example.com'; $accessToken = session('access_token'); // 关键调试:先看session里的令牌到底是什么 dd($accessToken); // 把这个值和Postman的令牌对比 // 剩下的代码保持不变... }
大概率会发现以下几种情况:
- Session里的令牌是空值(说明前端没把正确的令牌传过来,或者后端存session的逻辑有问题)
- Session里的令牌是旧的、已过期的令牌
- 令牌有多余的空格/换行符(比如前端传递时没处理好格式)
2. 修复令牌的传递与格式问题
如果发现令牌有格式问题,或者不确定是否有多余字符,可以给令牌加个trim()处理,同时确保Bearer和令牌之间的空格正确:
$headers = [ "Accept:application/json", "Content-Type:application/json", "Authorization:Bearer ".trim($accessToken) // 去掉令牌前后的空白字符 ];
3. 排查前端到后端的令牌传递流程
你需要确认:
- 前端是否真的把正确的
access_token传递给了后端?比如是通过AJAX请求头、表单字段还是URL参数传递的? - 后端存储session的逻辑是否正确?比如是不是在登录/获取令牌后,把
access_token正确存入了session(['access_token' => $token])?
4. 检查Passport令牌类型与认证中间件
如果以上都没问题,再确认目标API的认证规则:
- 目标API是不是要求使用个人访问令牌(Personal Access Token),而你前端获取的是密码授权令牌(Password Grant Token)?不同类型的令牌可能无法兼容特定的认证逻辑
- 目标API的路由是否使用了
auth:api中间件?你的令牌是否是通过Passport合法生成的?
带调试的优化版代码
把这些排查点整合到代码里,方便定位问题:
public function global_Curl_Post($data , $url) { $server = env('API_ENDPOINT_NGINX_NAME') ?? 'https://digitalapps*****.example.com'; $accessToken = session('access_token'); // 调试1:检查令牌是否存在 if (empty($accessToken)) { dd('错误:Session中未获取到access_token,请检查前端传递与后端存储逻辑'); } // 调试2:打印令牌对比Postman // dd('Session中的令牌:'.$accessToken); $headers = [ "Accept:application/json", "Content-Type:application/json", "Authorization:Bearer ".trim($accessToken) ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $server.'/'.$url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); // 调试3:检查curl请求本身是否有错误 if(curl_errno($ch)){ dd('Curl请求错误:'.curl_error($ch)); } $responseData = json_decode($response); curl_close($ch); dd($responseData); return $responseData; }
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

