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

JWT Bearer Token无效排查:PHP Curl请求返回401错误如何解决?

问题描述

我正在排查代码无法正常运行的原因,当前逻辑是通过initAPI函数发起Curl请求获取access_token(调试确认JWT Token正确),但在bankIdVerify函数中携带该Token发起POST请求时,接口返回401错误:

{"status":401,"code":"token_invalid_not_a_jwt","title":"The provided bearer token is not a valid JWT","detail":"","traceId":"nHR4NMjtZ2lusq8bQRqNPlTF2CdQ2"}

用Postman发送相同请求能得到有效响应,请问哪里操作有误或遗漏了什么?

代码示例

function initAPI(){
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "URL");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "FIELDS");
    
    $headers = array();
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);
    return $result;
 }

 $init_api_res = json_decode(initAPI());

 $access_token = $init_api_res->access_token;

 //print_r("[DEBUG] JWT: ".$access_token); //Outputting correct JWT

 function bankIdVerify() {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "URL");
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Authorization: Bearer '. $access_token, 'Content-Type: application/json'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    $data = <<<DATA
    {
        //i have removed this data for safety reason also it is not relevant.
    }
    DATA;

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

    $resp = curl_exec($curl);
    curl_close($curl);

    return $resp;
 }

 print_r(bankIdVerify());

调试输出的JWT Token

[DEBUG] JWT: eyJhbGciOiJSUzI1NiIsImtpZCI6InNhbmRib3gtc2lnbmluZy1rZXktN2ViNmZkNjhiMTk5YjA0M2FlY2I1ZGRjMzI0ZWYwZmQiLCJ0eXAiOiJhdCtqd3QifQ.eyJpc3MiOiJodHRwczovL2FwaS5zaWduaWNhdC5jb20vYXV0aC9vcGVuIiwibmJmIjoxNzA2ODc5MDEzLCJpYXQiOjE3MDY4NzkwMTMsImV4cCI6MTcwNjg3OTYxMywiYXVkIjoiaHR0cHM6Ly9hcGkuc2lnbmljYXQuY29tIiwic2NvcGUiOlsic2lnbmljYXQtYXBpIl0sImNsaWVudF9pZCI6InNhbmRib3gtZ3JpdHR5LWJ1Y2tldC04MTYiLCJhY2NvdW50X2lkIjoiYS1zcGdlLXI5eGpUV29nbk5adlJLSzJ6bW83Iiwic2FuZGJveCI6dHJ1ZSwianRpIjoiNDYyNzg4RDlBM0VEOTMzQTZBQjhFMEI0RDExQTgzMjQifQ.picqUqyxNppiYf6NQncxE2qsWJWS7-Ls8EPhQZGbiqJIP7Rr8RUPQTdKieRxjx_A1OZj6MfR885kAYSHxFrFvsqsFdouYZ0HdeS1USXpLw9aZn9ozZOpN7O8F4wIfZDjVQ0saDNHu7QQJC9q6f5C3gtXaMxzifJ8fc2Cv69CFgiyft1fCozvmvhjxuu61ZwgL6lAbNeS5dS4df7Yc4Wmxlj-pLDhHpmuVg_mK9c4lPMKik-qp6i3MsYbSBUkPGG8lUhO4vsnfFkIjh5UnwarVShasgO6g7CcvwNpz82zjrZyHFp7gXN0H7DbX11W5Xe4QQijjDEtf7Qccoji2r-gfA
问题排查与解决方案

核心问题是变量作用域:你在全局作用域定义的$access_token,在bankIdVerify函数内部无法直接访问,导致生成的Authorization头中没有携带有效的JWT Token,接口因此返回"token_invalid_not_a_jwt"错误。

两种解决方式:

1. 将Token作为参数传入函数(推荐,符合代码规范)

修改bankIdVerify函数定义,添加参数接收$access_token,调用时传入该变量:

function bankIdVerify($access_token) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "URL");
    // 这里使用传入的参数$access_token
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Authorization: Bearer '. $access_token, 'Content-Type: application/json'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    $data = <<<DATA
    {
        // 数据内容
    }
    DATA;

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

    $resp = curl_exec($curl);
    curl_close($curl);

    return $resp;
 }

 // 调用时传入token
 print_r(bankIdVerify($access_token));

2. 在函数内部声明使用全局变量(不推荐,易引发维护问题)

在bankIdVerify函数开头添加global $access_token,声明使用全局作用域的变量:

function bankIdVerify() {
    global $access_token; // 声明使用全局变量
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, "URL");
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json', 'Authorization: Bearer '. $access_token, 'Content-Type: application/json'));
    // 后续代码不变
 }

额外调试建议

可以在bankIdVerify函数中输出实际生成的Authorization头,确认Token是否正确携带:

$authHeader = 'Authorization: Bearer '. $access_token;
var_dump($authHeader); // 查看实际生成的头内容,确认Token是否存在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:22:02