JAVA发布的JWT在PHP校验签名,关联SecretKeySpec,HmacSHA256,hash_hmac

对接一个 java 项目,那边派发的 JWT 需要在 php 这边校验签名的有效性:

java生成JWT代码:

public static final String key = "123456789";
private static final SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(UTF8_CHARSET), “HmacSHA256”);
token = Jwts.builder()
    .setIssuer(ISSUER)
    .claim(KEY_V, 1)
    .claim(KEY_ACCOUNT_ID, '123123')
    .claim(KEY_APP_VERSION, '1.2.3')
    .setIssuedAt(new Date())
    .setExpiration(this.expireTime)
    .signWith(SignatureAlgorithm.HS256, secretKey).compact();

java 解析代码

// 这里的secretKey就是上面的
Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();

带上这样的 jwt 来请求php这边,尝试使用标准 jwt 包解析都不太行,验证签名不相符,自己动手吧;

PHP 解析代码

protected function parseToken($token, $key)
{
    $arr = explode('.', $token);
    if (count($arr) != 3) {
        throw new UserException('授权码格式错误');
    }
    $header = base64_decode($arr[0]);
    $payload = base64_decode($arr[1]);
    $sign = $arr[2];
    $localSign = $this->base64UrlEncode(hash_hmac('sha256', $arr[0] . '.' . $arr[1], $key, true));
    if ($sign != $localSign) {
        throw new UserException('签名校验失败');
    }
    return $payload;
}

public function base64UrlEncode($str)
{
    $data = base64_encode($str);
    $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data);
    return $data;
}

标题:JAVA发布的JWT在PHP校验签名,关联SecretKeySpec,HmacSHA256,hash_hmac

原文链接:https://beltxman.com/3872.html

若无特殊说明本站内容为 行星带 原创,未经同意请勿转载。

发表评论

您的电子邮箱地址不会被公开。

Scroll to top