PHP使用JWT解码函数时出现Wrong number of segments错误的解决
问题解决:JWT解码时的"Wrong number of segments"异常
问题根源
当无请求(或请求未携带Authorization头)时直接访问PHP页面,会触发以下连锁问题:
$headers['authorization']不存在,直接取值会导致$headertoken为null- 后续
str_replace和substr处理后,$resultado2依然为null - 将
null传入JWT::decode()会触发UnexpectedValueException——因为JWT要求必须是三段式结构的字符串
修复方案
需在代码中添加请求头存在性检查、Token有效性校验和异常捕获,确保无论是否携带请求头,服务端都能正常返回JSON响应,而非抛出致命错误。
修改后的PHP代码
<?php $headers = apache_request_headers(); // 先检查Authorization头是否存在,避免直接取值报错 $headertoken = isset($headers['authorization']) ? $headers['authorization'] : ''; $resultado2 = ''; $decoded = null; $estado = 'error'; if (!empty($headertoken)) { // 用正则精准去除Bearer前缀(避免误删Token中含有的"Bearer"字符串) $resultado = preg_replace('/^Bearer\s+/', '', $headertoken); $resultado2 = trim($resultado); // 捕获JWT解码异常,防止页面崩溃 try { $decoded = JWT::decode($resultado2, new Key($key, 'HS256')); $estado = 'ok-validado'; } catch (UnexpectedValueException $e) { $estado = 'error-token-invalido'; } catch (Exception $e) { $estado = 'error-desconocido'; } } $array = array( 'estado' => $estado, 'heade' => $headertoken, 'uss' => $resultado2, // 可选:返回错误详情,方便调试 'error_msg' => isset($e) ? $e->getMessage() : '' ); echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>
关键改动说明
- 请求头安全取值:用
isset()判断authorization头是否存在,避免直接访问数组未定义键的警告 - 精准处理Token前缀:用正则
/^Bearer\s+/替换前缀,比str_replace更严谨,不会误删Token内容中的"Bearer"字符串 - 异常捕获机制:用
try-catch包裹解码逻辑,捕获所有可能的异常,确保服务端始终返回JSON格式响应 - 状态区分:通过
estado字段明确返回不同状态,方便Flutter客户端做分支处理
Flutter端优化建议
确保token不为空再发送请求,避免传递无效的Authorization头:
if (token != null && token.isNotEmpty) { Map<String, String> header = { 'Authorization': 'Bearer $token' }; // 后续请求逻辑... } else { print('Token为空,无法发送验证请求'); }
内容的提问来源于stack exchange,提问作者Anes
相关产品推荐
相关产品推荐

