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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:45:06