如何验证用户JWT通过令牌是否正确

时间:2018-04-21 13:17:34

标签: validation jwt token

我的意思是不验证正确的格式令牌。

根据jwt/README.md at 3.2 · lcobucci/jwt 此验证验证了正确的格式标记,但是当我设置类似http://example.org/token/123.123.123的值时,此库将抛出异常,如下所示:

enter image description here

如何验证用户JWT传递令牌是否正确,有2个点?

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
}