如何在PHP/Laravel中无需密钥或校验解码第三方生成的JWT
PHP/Laravel无校验解码第三方JWT解决方案
JWT本身为头部.载荷.签名三段Base64Url编码的字符串拼接结构,仅解码内容完全不需要密钥,也不依赖生成JWT的库,可通过以下两种方案实现和前端jwt-decode库完全一致的效果:
方案1:无额外依赖手动实现
直接基于JWT结构写解码逻辑,不需要安装任何第三方库,可直接放到Laravel的辅助函数文件中使用:
if (!function_exists('jwt_decode_no_verify')) { function jwt_decode_no_verify(string $jwt): ?object { $tokenParts = explode('.', $jwt); // 非标准JWT格式直接返回空 if (count($tokenParts) !== 3) { return null; } // 适配JWT使用的Base64Url编码规则 $base64UrlDecode = function (string $input): string { $padLength = 4 - strlen($input) % 4; if ($padLength < 4) { $input .= str_repeat('=', $padLength); } return base64_decode(strtr($input, '-_', '+/')); }; return (object) [ 'header' => json_decode($base64UrlDecode($tokenParts[0])), 'payload' => json_decode($base64UrlDecode($tokenParts[1])) ]; } }
调用示例:
// 传入第三方接口返回的JWT字符串即可 $decodedJwt = jwt_decode_no_verify($externalJwt); // 直接读取载荷字段 $expireAt = $decodedJwt->payload->exp ?? null; $userUuid = $decodedJwt->payload->uuid ?? null;
方案2:基于已安装的firebase/php-jwt实现
如果项目已经安装了firebase/php-jwt库,可直接调用其内置的Base64Url解码方法实现,不需要额外写编码适配逻辑:
use Firebase\JWT\JWT; $tokenParts = explode('.', $externalJwt); if (count($tokenParts) === 3) { $jwtHeader = json_decode(JWT::urlsafeB64Decode($tokenParts[0])); $jwtPayload = json_decode(JWT::urlsafeB64Decode($tokenParts[1])); }
注意事项
- 两种方案均不会校验JWT的签名有效性,仅做内容解码,和前端
jwt-decode库的功能完全对齐 - 解码后的内容仅可用于非敏感逻辑展示,涉及权限判断、敏感操作的场景必须按照你的业务规则调用外部API完成JWT有效性校验
内容的提问来源于stack exchange,提问作者jove0610
相关产品推荐
相关产品推荐

