您的位置 首页 java

系统对接不用愁,快速解决单点登录问题

jwt编解码

项目中需要支持 单点登录 的功能,由于学识浅薄,并不明白什么是JWT,所以网上查询总结了一下,供大家参考:

首先介绍一下什么是JSON Web Token(JWT)?

官方文档是这样解释的:JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为 JSON 对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用 RSA 或ECDSA的公钥/ 私钥 对进行签名。

虽然JWT可以加密以在各方之间提供保密,但只将专注于签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则隐藏其他方的声明。当使用公钥/私钥对签署令牌时,签名还证明只有持有私钥的一方是签署私钥的一方。

通俗来讲,JWT是一个含签名并携带用户相关信息的加密串,页面请求校验登录接口时,请求头中携带JWT串到后端服务,后端通过签名加密串匹配校验,保证信息未被篡改。校验通过则认为是可靠的请求,将正常返回数据。

以下是具体的操作步骤:

引用

<dependency>
 <groupId>com.auth0</groupId>
 <artifactId>java-jwt</artifactId>
 <version>3.4.1</version>
</dependency>
 

创建并签署令牌

  • Example using HS256
try {
 Algorithm algorithm = Algorithm.HMAC256("secret");
 String token = JWT.create()
 .with iss uer("auth0")
 .sign(algorithm);
} catch (JWTCreationException exception){
 //Invalid Signing configuration / Couldn't convert Claims.
}
 
  • Example using RS256
RSAPublicKey publicKey = //Get the key instance
RSAPrivateKey privateKey = //Get the key instance
try {
 Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
 String token = JWT.create()
 .withIssuer("auth0")
 .sign(algorithm);
} catch (JWTCreationException exception){
 //Invalid Signing configuration / Couldn't convert Claims.
}
 

验证令牌

  • Example using HS256
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
 Algorithm algorithm = Algorithm.HMAC256("secret");
 JWTVerifier verifier = JWT.require(algorithm)
 .withIssuer("auth0")
 . build (); //Reusable verifier instance
 DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
 //Invalid signature/claims
}
 
  • Example using RS256
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
RSAPublicKey publicKey = //Get the key instance
RSAPrivateKey privateKey = //Get the key instance
try {
 Algorithm algorithm = Algorithm.RSA256(publicKey, privateKey);
 JWTVerifier verifier = JWT.require(algorithm)
 .withIssuer("auth0")
 .build(); //Reusable verifier instance
 DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
 //Invalid signature/claims
}
 

深入使用的话还有其他的方式,包括时间限制,权限限制等。后续有时间研究后分享给大家。

JS的使用方式

//创建并签署令牌 
sJWS = KJUR.jws.JWS.sign(null, '{"alg":"HS256", "cty":"JWT"}', '{"age": 21}', {"utf8": "password"});
// 验证令牌
isValid = KJUR.jws.JWS.verify('eyJjdHkiOiJKV1QiLCJhbGc...', {"utf8": "password"});
// 验证令牌
isValid = KJUR.jws.JWS.verifyJWT('eyJh...', {"utf8": "password"}, {
 alg: ['HS256', 'HS384'],
 iss: ['
});
 

总结:

优点:在非跨域环境下使用JWT机制是一个非常不错的选择,实现方式简单,操作方便,能够快速实现。由于服务端不存储用户状态信息,因此大用户量,对后台服务也不会造成压力;

缺点:跨域实现相对比较麻烦,安全性也有待探讨。因为JWT令牌返回到页面中,可以使用js获取到,如果遇到XSS攻击令牌可能会被盗取,在JWT还没超时的情况下,就会被获取到敏感数据信息。

文章来源:智云一二三科技

文章标题:系统对接不用愁,快速解决单点登录问题

文章地址:https://www.zhihuclub.com/201174.shtml

关于作者: 智云科技

热门文章

网站地图