JWT介绍
JWT,全称是JSON WEB TOKEN
, 属于一个规范,它定义了一种简洁的、自身包含协议的格式,用于在通信双方传递json对象,适合使用在分布式站点的单点登录(SSO)场景。
JWT优点
- 基于json,方便解析。
- 在令牌中自定义内容,方便拓展。
- 安全性高
- 资源服务可以不依赖认证服务就能完成授权。
JWT缺点
字符串过长,占用存储空间过大。 由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据
使用场景
应用最多的场景是登录授权,相比原先的session、cookie来说,更快更安全,跨域也不再是问题,并且支持移动端,一旦用户登录,后续每个请求都将包括JWT,从而允许用户访问该令牌允许的路由、服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
JWT令牌是一大串不可读的字符,其中包含的信息已隐藏和编码,被签名或加密算法覆盖。它由三部分组成:头部(Header)、主体(Payload)和签名(Signature),实际上是一个字符串,以.
符号分隔开:Header.Body.Signature。
//类似这种
xxx.yyy.zzz
头部Header
header包含token的元数据,主要是加密算法和签名的类型,如下面的信息,说明了加密的对象类型是JWT,加密算法是HMAC SHA-256。
主体Payload
payload主要包含一些声明信息,这些声明是key-value的数据类型。通常如用户名、角色、有效期、颁发者、接受者、过期日期等,因为是未加密的,因此不建议存放敏感信息,同时通过Base64编码后存入token中。 JWT规定了7个官方字段,如下所示:
- iss:JWT的签发人
- exp:JWT的过期时间
- sub:JWT所面向的用户
- aud:JWT的接收方
- nbf:JWT的生效时间
- iat:JWT的签发时间
- jti:JWT的编号
签名Signature
signature要符合jws(Json Web Sianature)的标准生成一个最终的签名。把编码后的Header和Payload信息加在一起,然后使用一个强加密算法,如 HmacSHA256,进行加密。在拿到签名数据之后,把这三个部分的数据拼接起来,每个部分中间使用.来分隔,JWT Token就生成了,接下来返回给客户端。而客户端每次请求时,都必须携带JWT Token在请求头中,服务器通过解密的方式判断对应的用户信息。
.NET中具体实现
1,nuget安装Microsoft.AspNetCore.Authentication.JwtBearer
2,创建jwt配置类
3,在 appsettings.json 增加jwt使用到的配置信息
4,在startup类的ConfigureServices方法中增加读取配置信息,注入JWT身份认证服务
5,生成用户token代码块
生成token的同时会给出当前token的失效时长、当前token过期后的刷新令牌token、刷新令牌失效时长等。每个token一旦生成,是有一定的失效时长,当前token若过期失效了,则可以通过刷新token来重新生成一个新的token。若刷新token也过期了,则让当前用户重新登录。