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);
问题分析
- Flutter端问题根源:当
token为null时,拼接出的Authorization头是Bearer null,这是一个字符串值,而非真正的空请求头或null值。 - 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
相关产品推荐
相关产品推荐

