Skip to main content

JWT协议

JWT 是JSON Web Token的缩写,是一种用于在网络上传递信息的轻量级、自包含的安全标准。JWT是基于JSON格式的标准,定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。通常,JWT被用于身份验证和信息传递,特别是在Web应用程序和服务之间。

1.1 /auth/jwt/[IDP颁发的应用标识](GET)

示例地址

#发起地址示例
http://127.0.0.1/auth/jwt/1697536951868985384

#重定向示例
http://127.0.0.1/jwt/login?jwttoken=xxxxxx

1.2 JWT 解析和验签过程

maven依赖

<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
</dependency>
private boolean parseIdToken(String idToken){
try {
SignedJWT signedJWT = SignedJWT.parse(idToken);
log.info("verify begin..");
RSASSAVerifier rsaKey = getRSASSAVerifier();
if (Objects.nonNull(rsaKey)) {
//验签过程
signedJWT.verify(rsaKey);
log.info("verify success ");
//获取token对象
JWTClaimsSet jwtClaim = signedJWT.getJWTClaimsSet();
//签名对象
log.info("idToken Issuer {}", jwtClaim.getIssuer());
//主体-一般为用户唯一标识
log.info("idToken Subject {}", jwtClaim.getSubject());
//过期时间
log.info("idToken ExpirationTime {}", jwtClaim.getExpirationTime());
return true;
}
} catch (Exception e){
log.error("验签异常",e);
}
return false;
}

/**
* 读取RSA公钥
* @return
*/
private RSASSAVerifier getRSASSAVerifier() {
try {
File file = ResourceUtils.getFile("classpath:jwk.jwks");
JWKSet jwkSet= JWKSet.load(file);
//kid为IDP颁发提供
RSASSAVerifier rsaSSAVerifier =
new RSASSAVerifier(((RSAKey) jwkSet.getKeyByKeyId(kid)).toRSAPublicKey());
return rsaSSAVerifier;
} catch (Exception e) {
log.error("加载RSA公钥失败",e);
}
return null;
}

1.3 添加应用

进入应用管理-新增应用,选择JWT,如下图所示

1.4 表单参数说明

参数说明

名称必填备注
应用图标应用的图标
应用编码只能输入数字和字母长度不超过64位
应用名称长度不超过64位
应用访问路径系统默认访问路径,
账号映射主体默认手机号码,根据应用自身选择账号体系,例如,选择手机号码,在解析jwttoken后,主体对象为手机号码
回调地址应用回调地址,认证成功后会往回调地址进行回调,颁发jwt令牌
签发人token的签发者
是否签名token是否需要进行签名
签名算法当前是否签名,选择签名时,需要选择签名算法,默认为RS256,支持RS256\RS384\RS512\HS256\HS384\HS512|
SSOJWT名称应用回调地址,认证成功后会往回调地址拼接jwttoken参数,参数名根据当前输入进行配置,如配置SSOJWT名称为jwttoken,则回调后http://domain.test.cn?jwttoken=xxxxxxx
请求方法回调请求方式,默认为GET,支持GET/POST
ID_TOKEN 有效期jwtToken的有效时长,默认1800,单位秒