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