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

PHP中JWT空Token验证失效及请求头获取问题求助

Flutter发送Null JWT到PHP后端的空值验证问题

问题描述

我是JWT新手,练习时遇到两个问题:

  • Flutter端在请求头中发送null的JWT Token,PHP端尝试用is_null()、$variable == null等方法验证空值时失效——明明变量显示为null,但判断结果却显示不为空;
  • PHP中使用$headers['authorization']获取请求头存在潜在问题。

相关代码

Flutter代码

Map<String, String> header = {
      
        'Authorization': 'Bearer $token'
      };

var Url= Uri.parse("http://....");
var response = await http.post(Url,
    body:{
        'contra' : Contras,
        'corr' : Corr,
       
    },
    headers: header
).timeout(const Duration(seconds: 90)) ;
var data = json.decode(response.body);
if(data['estado'] == "ok-validado"){  
    print("correct");
}else{
    print("incorrect");
}

PHP代码

use Firebase\JWT\JWT;
 use Firebase\JWT\key;    
require __DIR__ . '../vendor/autoload.php';
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization');

 $headers = apache_request_headers();
 $headertoken = $headers['authorization'];

   $resultado = str_replace("Bearer","",$headertoken); 
       $resultado2 = substr($resultado,1); 

   if($resultado2 === null){
   $val = "is null";
       }else{
        $val ="is not null";
       }
   $array = array(
        'description' => $val,      
    );
    
    echo json_encode($array,JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE |  JSON_UNESCAPED_SLASHES);

问题分析

  1. Flutter端问题根源:当token为null时,拼接出的Authorization头是Bearer null,这是一个字符串值,而非真正的空请求头或null值。
  2. PHP端问题根源:
    • 直接访问$headers['authorization']会触发Undefined index错误(如果请求头不存在时);
    • 处理后的resultado2实际是字符串"null",而非PHP的null类型,所以$resultado2 === null判断永远不成立。

解决方案

Flutter端优化

当token为空时,不添加Authorization头,避免发送无效的Bearer null:

Map<String, String> header = {};
if (token != null && token.isNotEmpty) {
  header['Authorization'] = 'Bearer $token';
}

var Url= Uri.parse("http://....");
var response = await http.post(Url,
    body:{
        'contra' : Contras,
        'corr' : Corr,
    },
    headers: header
).timeout(const Duration(seconds: 90)) ;
var data = json.decode(response.body);
if(data['estado'] == "ok-validado"){  
    print("correct");
}else{
    print("incorrect");
}

PHP端修复

  • 先检查请求头是否存在,避免报错;
  • 正确识别空值、空字符串或"null"字符串的情况:
use Firebase\JWT\JWT;
use Firebase\JWT\Key;    
require __DIR__ . '../vendor/autoload.php';
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization');

$headertoken = null;
$headers = apache_request_headers();
// 先验证Authorization头是否存在
if (isset($headers['authorization'])) {
    $headertoken = trim($headers['authorization']);
}

$resultado2 = '';
if ($headertoken) {
    // 拆分Bearer前缀和token内容,最多分2部分
    list($bearer, $token) = explode(' ', $headertoken, 2);
    $resultado2 = trim($token ?? '');
}

// 覆盖所有空值场景:null、空字符串、"null"字符串
if (empty($resultado2) || strtolower($resultado2) === 'null') {
    $val = "is null";
} else {
    $val = "is not null";
}

$array = array(
    'description' => $val,      
);

echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:52:53