在 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
异常这玩意儿用得少咯?