簡體   English   中英

如何驗證用戶JWT通過令牌傳遞是否正確

[英]How to validate the user JWT pass over Token is correct

我的意思是不驗證正確格式的令牌。

根據jwt / README.md的3.2·lcobucci / jwt,此驗證正在驗證正確格式的令牌,但是當我設置http://example.org/token/123.123.123類的值時,該庫將引發異常,像這樣:

在此處輸入圖片說明

如何驗證用戶JWT通過令牌傳遞正確的2個點?

我已經有了一個解決方案,可以分享給所有人:

// $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); 沒有錯誤。

不知道有沒有更好的辦法?

無需預先驗證任何內容,因為該庫為您提供了一個例外。 例外的目的是為了處理這種情況而將其捕獲。 因此,您需要的是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM