1.JWT的简介
Json web token (JWT), 是为了在⽹络应⽤环境间传递声明⽽执⾏的⼀种基于JSON的开放标准((RFC
7519).定义了⼀种简洁的,⾃包含的⽅法⽤于通信双⽅之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使⽤HMAC算法或者是RSA的公私秘钥对进⾏签名。
2.JWT的组成
- Header 头部
属于JWT的第一部分。头部包含两部分,token的类型和采用的加密算法,使用Base64编码,也就是说,它可以被翻译回来原来的样子。
1 | json复制代码{ |
- Payload负载
存放信息的地方,常⽤的有 iss(签发者),exp(过期时间),sub(⾯向的⽤户),aud(接收⽅),iat(签发时间)。也是由Base64加密的,所以可以被翻译回原来的样子,所以这里要注意不要把密码放在这部分 - Signature签名
签名部分,需要使用密钥加上header中的签名算法一起解密才能解开,签名的作用是保证jwt没有被篡改过。如果有⼈对头部以及负载的内容解码之后进⾏修改,再进⾏编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不⼀样的。如果要对新的头部和负载进⾏签名,在不知道服务器加密时⽤的密钥的话,得出来的签名也是不⼀样的。
3.使用JWT的好处
传统的OAuth2在校验token的时候还需要去授权中心去检验token的正确性,从性能上来说会多一步调用,导致性能低下。而使用JWT后,因为JWT由公钥和私钥,我们在授权中心用私钥加密,在资源端用公钥解密,如果能解出来,说明token是有效的。这样就可以减少一部分性能的损耗,而且由于可以在payload端放一些资源信息,在解密成功后也可以直接从jwt中获取一部分信息,减少重复查询的消耗。
4.公钥私钥的生成
使用keytool⼯具⽣成公钥私钥证书
1. 生成密钥证书
使用下面的命令生成密钥证书,采用RSA算法来生成公钥和私钥
1 | bash复制代码keytool -genkeypair -alias kaikeba -keyalg RSA -keypass kaikeba -keystore kaikeba.jks -storepass kaikeba |
keytool工具是一个java提供的证书管理工具,它的各命令的解释:
- alias:密钥的别名
- keyalg:使⽤的hash算法
- keypass:密钥的访问密码
- keystore:密钥库⽂件名
- storepass:密钥库的访问密码
2.导出公钥
使用openSsl来导出公钥信息,下载地址
- 配置环境变量
2. 解密公钥
进入xx.jks 文件所在的文件夹,然后执行下面的命令
1 | css复制代码keytool -list -rfc --keystore kaikeba.jks | openssl x509 -inform pem - pubkey |
就可以得到公钥信息:
然后将公钥信息复制到一个public.key
的文件夹中。后续放到资源服务器的resources下即可。
5.实际使用
需要使用的依赖
1 | xml复制代码 <!-- OAuth2 鉴权 --> |
授权中心的配置
- 授权中心需要配置一个
AuthorizationServerConfiguration
继承AuthorizationServerConfigurerAdapter
1 | java复制代码package com.study.auth.config; |
- 授权中心需要配置一个
SecurityConfiguration
继承WebSecurityConfigurerAdapter
1 | scala复制代码package com.study.auth.config; |
资源中心的配置
注:资源中心配置后,在启动的时候会拿公钥去访问一次授权中心,判断公钥是否是正确的。访问的地址为授权中心服务的地址:http://localhost:9098/oauth/token_key 其中 oauth/token_key 是授权框架的接口。
- application.yml需要配置如下配置
1 | yaml复制代码security: |
- JWTConfig的配置
用来做token的解密配置
1 | java复制代码package com.study.config; |
ResourceServerConfiguration
配置
用来做拦截的资源配置
1 | scala复制代码package com.study.config; |
}
1 | 复制代码 |
本文转载自: 掘金