对接一个 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
若无特殊说明本站内容为 行星带 原创,未经同意请勿转载。