我的意思是不验证正确的格式令牌。
根据jwt/README.md at 3.2 · lcobucci/jwt
此验证验证了正确的格式标记,但是当我设置类似http://example.org/token/123.123.123
的值时,此库将抛出异常,如下所示:
如何验证用户JWT传递令牌是否正确,有2个点?
答案 0 :(得分:0)
我已经有了解决方案,分享给所有人:
// $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();
如果有效,$preValidToken
将是array
,内容如下:
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
然后,我们可以通过验证此数组来验证令牌是否有效,如果没有问题,我们可以无错误地执行下一个代码行$token = (new Parser())->parse((string) $token);
。
我不知道是否有更好的方法?
答案 1 :(得分:0)
没有必要预先验证任何东西,因为图书馆给你一个例外;例外的目的是可以捕获它们以处理这种情况。所以你需要的就是:
try {
$token_info = (new Parser())->parse((string) $token_string);
// successful
} catch(RuntimeException $e) {
// unsuccessful
}