You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel API调用返回401未授权(Guzzle与PHP Curl)求助

可能的原因及排查方向

我之前也碰到过一模一样的情况——Postman和原生PHP Curl调用API完全正常,换到Laravel里用Guzzle或者原生Curl就返回401,排除CORS后,可以从这几个方向逐一排查:

  • 请求头的传递格式不一致
    先仔细核对Postman里传递api_token的方式:是放在Authorization: Bearer {token}的请求头里?还是作为URL参数?api_token=xxx?或是塞进了请求体?
    比如如果Postman用的是Bearer头,但你在Laravel的Guzzle代码里写成了'headers' => ['api_token' => $token],那肯定会认证失败。一定要保证Guzzle的请求头和Postman完全对齐,举个正确的示例:

    $client->request('GET', '/api/your-endpoint', [
        'headers' => [
            'Authorization' => 'Bearer ' . $yourValidToken,
            'Accept' => 'application/json',
        ],
    ]);
    
  • Laravel调用时意外携带了Session Cookie
    如果你的调用方是Laravel应用,且和API端同域名/同项目,Laravel会自动把当前用户的Session Cookie附加到请求里。而Laravel的auth:api中间件在检测到Session存在时,会优先尝试Session认证,直接忽略你传递的api_token——如果当前Session对应的用户没有权限,自然就返回401了。
    解决方法很简单,在Guzzle请求里禁用自动携带Cookie:

    $client->request('GET', '/api/your-endpoint', [
        'headers' => [...],
        'cookies' => false, // 关闭自动携带Cookie
    ]);
    
  • 请求的Content-Type设置错误
    如果你发送的是POST/PUT类请求,Postman里大概率设置了Content-Type: application/json,但你的Guzzle代码可能漏加了这个头,导致API端无法正确解析请求体,甚至间接影响认证逻辑(比如某些自定义认证依赖请求参数)。一定要加上正确的Content-Type,用Guzzle的json参数还能自动处理编码:

    $client->request('POST', '/api/your-endpoint', [
        'headers' => [
            'Authorization' => 'Bearer ' . $yourValidToken,
            'Accept' => 'application/json',
        ],
        'json' => ['key' => 'value'], // 自动设置Content-Type并编码JSON
    ]);
    
  • 代码中Token的引用错误
    虽然你说用的是和Postman相同的Token,但还是要仔细检查代码里的变量:是不是把错误的变量传进去了?比如定义了$apiToken但代码里写的是$token,或者Token被额外转义、截断了?可以在请求前打印一下$yourValidToken的值,和Postman里的内容逐字符对比,确保完全一致。

  • 全局请求拦截/修改
    检查你的Laravel应用有没有全局的Guzzle中间件,或者自定义的HTTP客户端配置——会不会是某些服务提供者自动给Guzzle设置了默认的Authorization头,覆盖了你手动传递的Token?

  • API端的请求日志排查
    最后一招:在API端的app/Http/Middleware/Authenticate.php里加一段日志,打印出请求的所有头和参数,看看Laravel实际接收到的Token是什么,和Postman的请求做对比,差异一目了然:

    // 在Authenticate.php的handle方法开头添加
    Log::info('API Auth Request Debug', [
        'headers' => $request->headers->all(),
        'query_params' => $request->query(),
        'request_body' => $request->input(),
    ]);
    

内容的提问来源于stack exchange,提问作者Prabakaran T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:44