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

在 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 not valid '
    ]);
    exit();
}

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

猜你喜欢

转载自blog.csdn.net/maxsky/article/details/80036512