• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

JWT(Json Web Token)框架 jjwt 教程

JAVA web前端中文站 2年前 (2018-02-05) 4856次浏览 已收录 0个评论

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。和?Cookie-Session 的模式不同,JSON Web Token(JWT)使用 Token 替换了 SessionId 的资源访问和状态的保持。基于 JWT 的 Token 认证的方式有很多优点,本文将介绍 JJWT 的相关用法。

更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏

jwt 是什么?

JWTs 是 JSON 对象的编码表示。JSON 对象由零或多个名称/值对组成,其中名称为字符串,值为任意 JSON 值。JWT 有助于在 clear(例如在 URL 中)发送这样的信息,可以被信任为不可读(即加密的)、不可修改的(即签名)和 URL – safe(即 Base64 编码的)。

jwt 的组成

  • Header: 标题包含了令牌的元数据,并且在最小包含签名和/或加密算法的类型
  • Claims: Claims 包含您想要签署的任何信息
  • JSON Web Signature (JWS): 在 header 中指定的使用该算法的数字签名和声明

jwt 的认证过程

  1. 用户登录系统;
  2. 服务端验证,将认证信息通过指定的算法(例如 HS256)进行加密,例如对用户名和用户所属角色进行加密,加密私钥是保存在服务器端的,将加密后的结果发送给客户端,加密的字符串格式为三个”.” 分隔的字符串 Token,分别对应头部、载荷与签名,头部和载荷都可以通过 base64 解码出来,签名部分不可以;
  3. 客户端拿到返回的 Token,存储到 local storage 或本地数据库;
  4. 下次客户端再次发起请求,将 Token 附加到 header 中;
  5. 服务端获取 header 中的 Token ,通过相同的算法对 Token 中的用户名和所属角色进行相同的加密验证,如果验证结果相同,则说明这个请求是正常的,没有被篡改。这个过程可以完全不涉及到查询 Redis 或其他存储;

JWT 安全性

  • 有很多库可以帮助您创建和验证 JWT,但是当使用 JWT 时,仍然可以做一些事情来限制您的安全风险。在您信任 JWT 中的任何信息之前,请始终验证签名。这应该是给定的。换句话说,如果您正在传递一个秘密签名密钥到验证签名的方法,并且签名算法被设置为“none”,那么它应该失败验证。
  • 确保签名的秘密签名,用于计算和验证签名。秘密签名密钥只能由发行者和消费者访问,不能在这两方之外访问。
  • 不要在 JWT 中包含任何敏感数据。这些令牌通常是用来防止操作(未加密)的,因此索赔中的数据可以很容易地解码和读取。
  • 如果您担心重播攻击,包括一个 nonce(jti 索赔)、过期时间(exp 索赔)和创建时间(iat 索赔)。这些在 JWT 规范中定义得很好。

jwt 的优点

  • 使用 json 作为数据传输,有广泛的通用型,并且体积小,便于传输;
  • 不需要在服务器端保存相关信息;
  • jwt 载荷部分可以存储业务相关的信息(非敏感的),例如用户信息、角色等;

JJWT

JJWT 是一个提供端到端的 JWT 创建和验证的 Java 库。永远免费和开源(Apache License,版本 2.0),JJWT 很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。

  • JJWT 的目标是最容易使用和理解用于在 JVM 上创建和验证 JSON Web 令牌(JWTs)的库。
  • JJWT 是基于 JWT、JWS、JWE、JWK 和 JWA RFC 规范的 Java 实现。
  • JJWT 还添加了一些不属于规范的便利扩展,比如 JWT 压缩和索赔强制。

JJWT?规范兼容

  • 创建和解析明文压缩 JWTs
  • 创建、解析和验证所有标准 JWS 算法的数字签名紧凑 JWTs(又称 JWSs):
    • HS256: HMAC using SHA-256
    • HS384: HMAC using SHA-384
    • HS512: HMAC using SHA-512
    • RS256: RSASSA-PKCS-v1_5 using SHA-256
    • RS384: RSASSA-PKCS-v1_5 using SHA-384
    • RS512: RSASSA-PKCS-v1_5 using SHA-512
    • PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256
    • PS384: RSASSA-PSS using SHA-384 and MGF1 with SHA-384
    • PS512: RSASSA-PSS using SHA-512 and MGF1 with SHA-512
    • ES256: ECDSA using P-256 and SHA-256
    • ES384: ECDSA using P-384 and SHA-384
    • ES512: ECDSA using P-521 and SHA-512

下面我们根据?https://github.com/jwtk/jjwt 上的 demo,来介绍下 JJWT 的用法。

jjwt 安装

jjwt 提供了 Maven 和 Gradle 两种构建方式,Maven 配置如下即可使用 JJWT。

 <dependency>     
 <groupId>io.jsonwebtoken</groupId>     
 <artifactId>jjwt</artifactId>     
 <version>0.9.0</version> </dependency>

Gradle 使用方式如下:

 dependencies { compile 'io.jsonwebtoken:jjwt:0.9.0' }

注意:JJWT 依赖于 Jackson 2.x. 如果您已经在您的应用程序中使用了旧版本的 Jackson 请升级相关配置。

创建签名密钥

 import io.jsonwebtoken.Jwts; 
 import io.jsonwebtoken.SignatureAlgorithm; 
 import io.jsonwebtoken.impl.crypto.MacProvider; 
 import java.security.Key; // 创建签名密钥,通常将从应用程序配置中读取。  
 Key key = MacProvider.generateKey(); 
 String compactJws = Jwts.builder().setSubject("Joe").signWith(SignatureAlgorithm.HS512, key).compact();

验证 JWT

 assert Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody().getSubject().equals("Joe");

SignatureException 异常

签名验证失败呢?你可以捕捉 SignatureException 并作出相应的反应。

 try { Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);//www.lisa33xiaoq.net
 OK, we can trust this JWT   } catch (SignatureException e) {     
 //don't trust the JWT! }

压缩签名

 String compactJws =  Jwts.builder().setSubject("Joe").compressWith(CompressionCodecs.DEFLATE)
 .signWith(SignatureAlgorithm.HS512, key).compact();

解析时,可以指定某些声明必须存在并设置为特定值。

 try {     
 Jws<Claims> claims = Jwts.parser().requireSubject("Joe").require("hasMotorcycle", true).setSigningKey(key).parseClaimsJws(compactJws); 
 }catch (MissingClaimException e) {     
 // we get here if the required claim is not present }catch(IncorrectClaimException e){     
 // we get here if the required claim has the wrong value}

参考资料

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:JWT(Json Web Token)框架 jjwt 教程
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址