Validation 如何验证用户JWT传递令牌是否正确

Validation 如何验证用户JWT传递令牌是否正确,validation,jwt,token,Validation,Jwt,Token,我的意思是没有验证正确的格式令牌 据 这个validate验证的是正确的格式标记,但是当我设置一个像http://example.org/token/123.123.123,此库将引发异常,如下所示: array (size=2) 0 => array (size=3) 'typ' => string 'JWT' (length=3) 'alg' => string 'HS256' (length=5) 'jti' =>

我的意思是没有验证正确的格式令牌

据 这个validate验证的是正确的格式标记,但是当我设置一个像
http://example.org/token/123.123.123
,此库将引发异常,如下所示:

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


如何用2个点验证用户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();
如果有效,
$preValidToken
将是一个
数组
,内容如下:

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=(newparser())->parse((string)$token)没有错误


我不知道是否有更好的方法?

无需预先验证任何内容,因为库会给您一个例外;异常的目的是为了处理情况而捕获异常。因此,您所需要的是:

try {
    $token_info = (new Parser())->parse((string) $token_string);
    // successful
} catch(RuntimeException $e) {
    // unsuccessful
}

我认为你从根本上误解了JWT是什么。“123.123.123”不是有效的令牌。代币不仅仅是随机数,它有特定的结构和意义。谢谢你回复我,我想你误解了我的意思。对,123.123.123不是有效的令牌,但我需要验证此值,因为我无法确认用户是否会传入有效值@如果是这样的话,你可能不理解异常的工作方式?请看下面我的答案。您在这里所做的一切都与库已经为您做的一样:解码JSON,并检测执行过程中是否存在错误。把它留给图书馆,然后处理它向你指出的错误。谢谢你,谢谢你…我为我的愚蠢感到非常抱歉@伊姆索普