This commit is contained in:
Looly 2022-09-13 22:06:40 +08:00
parent 18daa4b431
commit 5afc3cca8d
2 changed files with 57 additions and 11 deletions

View File

@ -119,6 +119,11 @@ public class JWT implements RegisteredPayload<JWT> {
* @return this
*/
public JWT setKey(final byte[] key) {
// 检查头信息中是否有算法信息
final String algorithmId = (String) this.header.getClaim(JWTHeader.ALGORITHM);
if (StrUtil.isNotBlank(algorithmId)) {
return setSigner(algorithmId, key);
}
return setSigner(JWTSignerUtil.hs256(key));
}
@ -316,19 +321,33 @@ public class JWT implements RegisteredPayload<JWT> {
}
/**
* 签名生成JWT字符串
* 签名生成JWT字符串计算方式为以HS256为例
* <pre>
* HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
* </pre>
*
* @param signer JWT签名器
* <p>此方法会补充如下的header</p>
* <ul>
* <li>当用户未定义"typ"赋默认值"JWT"</li>
* <li>当用户未定义"alg"根据传入的{@link JWTSigner}对象类型赋值对应ID</li>
* </ul>
*
* @param signer 自定义JWT签名器非空
* @return JWT字符串
*/
public String sign(final JWTSigner signer) {
Assert.notNull(signer, () -> new JWTException("No Signer provided!"));
// 检查tye信息
final String type = (String) this.header.getClaim(JWTHeader.TYPE);
if (StrUtil.isBlank(type)) {
this.header.setType("JWT");
}
// 检查头信息中是否有算法信息
final String claim = (String) this.header.getClaim(JWTHeader.ALGORITHM);
if (StrUtil.isBlank(claim)) {
this.header.setClaim(JWTHeader.ALGORITHM,
AlgorithmUtil.getId(signer.getAlgorithm()));
final String algorithm = (String) this.header.getClaim(JWTHeader.ALGORITHM);
if (StrUtil.isBlank(algorithm)) {
this.header.setAlgorithm(AlgorithmUtil.getId(signer.getAlgorithm()));
}
final String headerBase64 = Base64.encodeUrlSafe(this.header.toString(), charset);
@ -378,9 +397,10 @@ public class JWT implements RegisteredPayload<JWT> {
}
/**
* 验证JWT Token是否有效
* 使用指定签名器验证JWT Token是否有效<br>
* 如果签名器为{@code null}或者{@link NoneJWTSigner}表示这个JWT无签名签名部分必须为空
*
* @param signer 签名器签名算法
* @param signer 签名器签名算法如果为{@code null}默认为{@link NoneJWTSigner}
* @return 是否有效
*/
public boolean verify(JWTSigner signer) {

View File

@ -30,10 +30,36 @@ public class JWTHeader extends Claims {
public static String KEY_ID = "kid";
/**
* 构造初始化默认(typ=JWT)
* 增加alg头信息
*
* @param algorithm 算法ID如HS265
* @return this
*/
public JWTHeader() {
setClaim(TYPE, "JWT");
public JWTHeader setAlgorithm(final String algorithm) {
setClaim(ALGORITHM, algorithm);
return this;
}
/**
* 增加typ头信息
*
* @param type 类型如JWT
* @return this
*/
public JWTHeader setType(final String type) {
setClaim(TYPE, type);
return this;
}
/**
* 增加cty头信息
*
* @param contentType 内容类型
* @return this
*/
public JWTHeader setContentType(final String contentType) {
setClaim(CONTENT_TYPE, contentType);
return this;
}
/**