Title: How to verify json web token (jwt) signature by using PHP native functions?

class Jsonwebtoken()
{
   public static function verify(string $token)
    {
        /**应该学习firebase jwt lib,做大量错误处理 */
        $tokenParts = explode('.', $token);
        list($headb64, $bodyb64, $cryptob64) = $tokenParts;

        /** both work */
        $pubKey = openssl_get_publickey('file://'.__DIR__.'/jwtRS256.key.pub');
        // $pubKey = file_get_contents(__DIR__.'/jwtRS256.key.pub');

        $signature = self::urlsafeB64Decode($cryptob64); // from Google Firebase JWT lib

        $isVerified = openssl_verify("$headb64.$bodyb64", $signature, $pubKey, OPENSSL_ALGO_SHA256);

        return $isVerified === 1; // openssl_verify return value is int
    }

    /**
     * Decode a string with URL-safe Base64.
     *
     * @param string $input A Base64 encoded string
     *
     * @return string A decoded string
     */
    public static function urlsafeB64Decode(string $input)
    {
        $remainder = strlen($input) % 4;
        if ($remainder) {
            $padlen = 4 - $remainder;
            $input .= str_repeat('=', $padlen);
        }
        return base64_decode(strtr($input, '-_', '+/'));
    }
}

说明

  1. 本方法仅适用于RS256加密,其他加密方法可以适当调整;
  2. 本方法参考了firebase jwt lib,但是省略了一些错误处理;

补充
好吧, 其实这个库有个parser,可以把string转化了token object
你可以说我的面向对象思维是欠缺的,也可以说这个库的文档也确实写的还是迷惑人。

标签: PHP, jwt, openssl_verify, json web token

添加新评论