php php解析jwt-go的playload出现乱码

528 阅读1分钟

jwt-go 生成包: dgrijalva/jwt-go v3.2.0

php base64解析playload出来以后是乱码,查阅了资料发现go的base64加密有两种方式:标准和URL

标准模式加、解密

base64.StdEncoding.EncodeToString(data)

base64.StdEncoding.DecodeString(str)

url编码加、解密

base64.UrlEncoding.EncodeToString(data)

base64.UrlEncoding.DecodeString(str)

然后查看jwt-go源码得知生成jwt用的编码模式是url模式

url模式会将编码中的 '+' 替换成 '-' 将 '/' 替换成 '_', 以防止url转义, 因此 php解析之前也应该先将上述字符替换回去。

/**
* @link https://www.php.net/manual/en/function.base64-decode
*/
 
function base64url_encode($data, $pad = null) {
    $data = str_replace(array('+', '/'), array('-', '_'), base64_encode($data));
    if (!$pad) {
        $data = rtrim($data, '=');
    }
    return $data;
}
 
function base64url_decode($data) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $data));
}