目录
前言
上一篇我们讲解了SpringSecurity之微服务权限解决方案,接下来我们看看在微服务中使用到的凭证Tokens的生成工具J W T
什么是J W T
1、访问令牌
自包含令牌 | 透明令牌 |
---|---|
授权服务器进行令牌的颁发操作,包含了关于用户的元数据信息和声明(claims) 通过对签名的检验,期望的颁发者(issuer)、期望的接收人(auienced)以及scope。资源服务器可以在本地对令牌进行校验操作,通常实现签名的的JSON Web Tokens,也就是我们常说的J W T | 随机生成字符串标识符,无法简单地猜测授权服务器是怎么办法和存储的。 资源服务器必须通过后台渠道发送回OAuth2授权服务器的令牌检查端点,这样才能检验令牌的有效状态,并且获取claims/scopes等其他的额外信息 |
2、J W T组成内容
eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_6tWKi5NUrJSSkzJzcxT0lFKzs8tSMyr9ExRssorzcnRUSotTi3yS8xNRVKTWlGgZGVoZm5hZGJsaW4BUQPSYQhklmZCtdYCAOmbbppbAAAA.wEtXn_lWnbqVDcTOyD_D2YbbZnHLljCpMqaOqXcecCXjTcfk8yvUQTO7EED-DKmSKoQ9Y8FaXNzaBWRoscPCbA
结构:base64url(Header)+base64url(Claims)+base64url(Signature)
其中三段之间使用“."隔开的。
从上面的结构我们可以看出来,其实这个凭证信息就是由三段字符串组成,中间有英文句号改开。组成一个很长的字符串凭证。
其实,每个子字符串都是一个功能模块,三个部分分别是:J W T头、有效载荷以及签名信息
J W T 头
这个头部分描述的是一个J W T元数据的json对象,通常如下所示:
{
“alg”:“HS256”,"typ":"JWT"
}
从上面的代码,alg属性他是标识签名使用的算法,默认的是HMAC SHA256;
type属性标识令牌的一个类型,J W T令牌他的统一写法就是J W T。然后在使用Base64url的算反将其转为字符串后进行保存。
有效载荷
这一部分就是我们的凭证的主体内容部分了,其实就是一个Json的对象,其中就含有传递的数据。他提供了7个字段供我们来选择
iss | 发行人 |
exp | 到期的时间 |
sub | 主题信息 |
aud | 用户信息 |
nbf | 在这之前 不使用的 |
iat | 发布的时间 |
jti | J W T ID用于标识 这个J W T信息 |
上面这个几个是我们默认的字段,我们也可以自定义自己的字段。
他也是使用Base64Url算法转换为字符串保存的。
注意:这个J W T默认是不进行加密操作的,所有人都能够解读到其内在的内容,所以在构建的时候,要谨慎使用隐私字段来存放保密信息,防止其会造成信息的泄露
签名哈希
这一部分,是对上面连个部分的数据签名操作,通过我们指定的算法进行哈希,用来确保数据不会被篡改。
1、需要指定一个密码(secret),他保存在我们服务端,不对外公布。
2、使用标头中已经制定的签名算法(默认HMAS SHA256)根据下面的公式进行签名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)
3、计算出来签名信息的哈希后,J W T头、有效载荷以及签名信息三个子串组成一个整体字符串,每个部分中间用“.”隔开,这样就构成了我们完整的J W T对象信息
Base64URL算法
J W T 头和有效载荷的序列化算法他们都用到了 Base64URL。
该算法和常见 Base64算法类似,稍有差别。
作为凭证的J W T可以放在URL中(例如 api.example/?token=xxx)。 Base64 中用的三个 字符是"+","/"和"=",由于在 URL 中有特殊含义,因此 Base64URL 中对他们做了替换: "="去掉,"+"用"-"替换,"/"用"_"替换,这就是 Base64URL 算法。
好了,关于J W T应用就介绍到这里!
欢迎大家点击下方卡片,关注《coder练习生》