JWT实现API网关统一认证应用
- 环境
nacos: 1.3.1
启动nacos
cd /usr/local/nacos/bin
sh startup.sh -m standalone
2.自定义网关配置
1)添加依赖
加入nacos-discovery发现服务的依赖、web、actuator用于监控检查,添加网关、hystrix容错、lombok、shiro支持、jwt支持依赖。
2)修改配置文件
配置nacos注册中心地址,自动注册、配置允许跨域请求、网关拦截路由、JWT跳过认证的路由、有效时长
3)配置JWT的网关过滤器
使用@ConfigurationProperties注解获取配置文件中跳过认证的路由
配置返回数据ReturnInfo的bean,用于页面标识认证成功,认证失败等信息数据传回页面,配置JWTModle存放用户信息
重写GlobalFilter接口中的filter方法,判断访问的url是否有配置文件中的跳过认证的路由,有则不进行认证,获取Header头部信息的Token若为空,则需进行认证,不为空则要对Token检查是否过期
认证错误输出,响应信息设置状态码为HttpStatus中未认证的状态码,响应信息设置为json类型,返回认证错误的json数据到页面
3.JWT 的工具类
1)Token的加密Key方法
自定义密钥KEY,使用Base64对KEY进行加密,使用MD5算法加密
2)生成Token的方法
使用Jwts设置Id、Payload(负载)为Token添加iss (issuer):签发人、签发时间、exp (expiration time):过期时间和签名、Claims、Subject
3)Token解码
4)验证Token是否过期
对Token进行解码,获取解码后的subject,获取过期时间并输出到控制台的info
4.添加认证的api接口
1)定义用户数据的bean
获取配置文件中配置的effective_time过期时间
2)定义api接口
3)启动类nacos发现
5.测试登录授权认证效果
1)登录认证
通过拦截进入https://www.sina.com.cn/的路由,会提示未登录认证Token
使用Post方式发送User的json数据进行登录认证请求获取token
通过复制data中的Token再一次进入访问sina的路由,并在Header添加Token为data中的Token值以Get方式发送,就可以进入访问到https://www.sina.com.cn/新浪首页
这里得effctive_time设置为1min,所以1min后再次使用Token访问会提示Token已过期,控制台输出Token过期时间
2)测试路由跳过验证
访问http://localhost:2225/baidu,则不需要进行Token认证,直接就会由网关转发到相关的id为baidu的路由