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,单位秒 |