PHP 接口开发使用 lcobucci/jwt 进行 Token 认证时提示 Error while decoding to JSON 解决方法

本文介绍了一种在PHP中处理未经过base64编码的JWT令牌的方法,并提供了一个实用的解决方案,同时还分享了如何通过异常处理机制来优化JWT验证过程。

在 Stack Overflow 提过这个问题,很快就被网友解答了,非常感谢,有兴趣的朋友可以去瞧瞧我的渣英文。How to validate the user JWT pass over Token is correct

当然,打不开还是看本文吧,hh(耸肩)

根据 lcobucci/jwt 官网 Wiki,我们成功创建了一个 Token

当我们在实际使用时,会在接口中传入 Token 以获得授权来继续操作,但是我们需要考虑一些额外的场景

就是非法 Token。

例如接口地址是这样的:http://example.org?token=123.123.123(真实 Token 经过 base64 编码并且中间有两个 .

当 Token 并未经过 base64 编码时,如果按照这个 JWT 库执行:

$token = (new Parser())->parse((string) $token);

将会得到一个异常:

异常

先来吐槽一下自己…我一直在想怎么处理这玩意儿(完全忘记了捕获异常这个事儿)

于是我弄了一个解决方案:(base64 解码后再拼装成 Json 字符串,就能得到 JWT 头,以此用来验证)

// $token from a HTTP request.
// Must have 2 dots.
if (substr_count($token, '.') === 2) {
    $preValidToken = base64_decode($token);
    // Get decoded token's last '}' position.
    $lastPos = strrpos($preValidToken, '}');
    if ($lastPos) {
        // Assemble Json string.
        $preValidToken = '[' . substr($preValidToken, 0, $lastPos + 1) . ']';
        $preValidToken = str_replace('}{', '},{', $preValidToken);
        // Convert to associative array.
        $preValidToken = json_decode($preValidToken, true);
        if ($preValidToken && is_array($preValidToken)) {
            var_dump($preValidToken);
            die;
            $token = (new Parser())->parse((string) $token);
            // Parses from a string
            // Do something here...
        }
    }
}
echo json_encode([
    'code' => 205,
    'msg' => 'Token not valid '
]);
exit();

打印出来结果是这样的:

array (size=2)
  0 => 
    array (size=3)
      'typ' => string 'JWT' (length=3)
      'alg' => string 'HS256' (length=5)
      'jti' => string '123123123' (length=9)
  1 => 
    array (size=6)
      'iss' => string 'http://example.org' (length=13)
      'jti' => string '123123123' (length=9)
      'iat' => int 1524314239
      'nbf' => int 1524314299
      'exp' => int 1524317839
      'uid' => int 1

最后的正确做法应该如下:

// 去 TMD 香蕉船异常

// 记得引入 RuntimeException
try {
    $token = (new Parser())->parse((string) $token);
    // If success, do here
} catch (RuntimeException $e) {
	// 也可以把 $e 打印出来,内容略多
    echo json_encode([
        'code' => 205,
        'msg' => 'Token invalid.'
    ]);
    exit();
}

哎,我现在在反省我自己,怪我 PHP 异常这玩意儿用得少咯?

laravel lcobucci/jwt是一个用于生成和验证JSON Web Tokens(JWT)的Laravel扩展包。它提供了一组方法和类,可以方便地创建和解析JWT,并提供了一些参数来定义JWT的属性。 安装lcobucci/jwt的步骤如下: 1. 在composer.json文件中添加"lcobucci/jwt": "^3.4"的版本依赖项,并运行composer install命令进行安装。 2. 安装OpenSSL扩展以支持JWT的加密和解密功能。 lcobucci/jwt提供了一些参数来定义JWT的属性: - iss(issuer):JWT的签发人,可以是发布者的URL地址。 - sub(subject):JWT所面向的用户,用于处理特定应用。 - aud(audience):受众人,可以是客户端的URL地址,用于验证是否是指定的人或URL。 - exp(expiration):JWT的过期间,以UNIX间戳表示。 - nbf(not before):JWT的可用间不能早于该间,以UNIX间戳表示。 - iat(issued at):JWT的发布间,以UNIX间戳表示。 - jti(JWT ID):JWT的唯一ID编号。 在使用lcobucci/jwt,你可以创建和解析JWT,以及验证JWT的有效性。以下是一个在Laravel控制器中使用lcobucci/jwt的示例代码: ```php <?php namespace App\Http\Controllers; use App\Tools\Service; use Illuminate\Http\Request; class TestController extends Controller { public function token() { // 生成token $token = Service::createToken(); // 解析token // $parse = Service::parseToken($token); // 验证token try { Service::validationToken($token); $json = [ "code" => 200, "message" => "Token验证通过", "sucess" => "ok" ]; return $json; } catch (\Exception $exception) { var_dump($exception->getMessage()); } } } ``` 以上示例代码展示了如何在TestController控制器中使用lcobucci/jwt来生成、解析和验证JWT。 总结来说,laravel lcobucci/jwt是一个用于生成和验证JSON Web Tokens的Laravel扩展包,它提供了一组方法和类来方便地创建和解析JWT,并提供了一些参数来定义JWT的属性。你可以在Laravel控制器中使用lcobucci/jwt来处理JWT相关的操作。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [badaso:Laravel无头CMS(SPA仪表板+ CRUD + API生成器等)](https://download.youkuaiyun.com/download/weixin_42118770/15836642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [laravel包lcobucci/jwt](https://blog.youkuaiyun.com/weiguang102/article/details/120169317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至天

看心情啦,最好留着自己喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值