jwt https://mp.weixin.qq.com/s/8FdzMq4msyhqE9Rrhgwqjw
使用JWT来实现对API的授权访问
什么是JWT
JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各个系统之间用JSON作为对象安全地传输信息,并且可以保证所传输的信息不会被篡改。
JWT通常有两种应用场景:
授权。这是最常见的JWT使用场景。一旦用户登录,每个后续请求将包含一个JWT,作为该用户访问资源的令牌。
信息交换。可以利用JWT在各个系统之间安全地传输信息,JWT的特性使得接收方可以验证收到的内容是否被篡改。
本文讨论第一点,如何利用JWT来实现对API的授权访问。这样就只有经过授权的用户才可以调用API。
JWT的结构
JWT由三部分组成,用.分割开。
Header
第一部分为Header,通常由两部分组成:令牌的类型,即JWT,以及所使用的加密算法。
{ "alg": "HS256", "typ": "JWT"}
Base64加密后,就变成了:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
第二部分为Payload,里面可以放置自定义的信息,以及过期时间、发行人等。
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}
Base64加密后,就变成了:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature
第三部分为Signature,计算此签名需要四部分信息:
Header里的算法信息
Header
Payload
一个自定义的秘钥
接受到JWT后,利用相同的信息再计算一次签名,然年与JWT中的签名对比,如果不相同则说明JWT中的内容被篡改。
解码后的JWT
将上面三部分都编码后再合在一起就得到了JWT。
需要注意的是,JWT的内容并不是加密的,只是简单的Base64编码。也就是说,JWT一旦泄露,里面的信息可以被轻松获取,因此不应该用JWT保存任何敏感信息。
JWT是怎样工作的
应用程序或客户端向授权服务器请求授权。这里的授权服务器可以是单独的一个应用,也可以和API集成在同一个应用里。
授权服务器向应用程序返回一个JWT。
应用程序将JWT放入到请求里(通常放在HTTP的Authorization头里)
服务端接收到请求后,验证JWT并执行对应逻辑。
在JAVA里使用JWT
引入依赖
这里使用了一个叫JJWT(Java JWT)的库。
JWT Service
生成JWT这里设置过期时间为10秒,因此生成的JWT只在10秒内能通过验证。
需要提供一个自定义的秘钥。
解码JWT
解码时会检查JWT的签名,因此需要提供秘钥。
验证JWT
JJWT并没有提供判断JWT是否合法的方法,但是在解码非法JWT时会抛出异常,因此可以通过捕获异常的方式来判断是否合法。
注册/登录
需要为还没有获取到JWT的用户提供一个这样的注册或者登录入口,来获取JWT。
获取到响应里的JWT后,要在后续的请求里包含JWT,这里放在请求的Authorization头里。
验证JWT
将验证操作放在Filter里,这样除了登录入口,其它的业务代码将感觉不到JWT的存在。
将登录入口放在WHITE_LIST里,跳过对这些入口的验证。
需要刷新JWT。如果JWT是合法的,那么应该用同样的Payload来生成一个新的JWT,这样新的JWT就会有新的过期时间,用此操作来刷新JWT,以防过期。
如果使用Filter,那么刷新的操作要在调用doFilter()之前,因为调用之后就无法再修改response了。
API
这时候API就处于JWT的保护下了。API可以完全不用感知到JWT的存在,同时也可以主动获取JWT并解码,以得到JWT里的信息。如上所示。
完整的DEMO可以在这里找到:https://github.com/Beginner258/jwt-demo
参考资料:https://jwt.io/
转载于:https://www.cnblogs.com/hongwu/p/9684915.html
jwt https://mp.weixin.qq.com/s/8FdzMq4msyhqE9Rrhgwqjw相关推荐
- 转:https://mp.weixin.qq.com/s/O_D_FVRIIII1wqq4jGZqHA
非常伟大震撼人心的演讲,希望每个人每天看一遍 传送门:https://mp.weixin.qq.com/s/O_D_FVRIIII1wqq4jGZqHA
- https://mp.weixin.qq.com/s/_ZxzEo1HfyM4DH-rLKcgIg? 电容(2)之旁路电容
https://mp.weixin.qq.com/s/_ZxzEo1HfyM4DH-rLKcgIg? 电容(2)之旁路电容
- 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html
出现"不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html"这种 ...
- 如何系统地自学一门Python 语言?https://mp.weixin.qq.com/s?__biz=MzA3ODY0MzEyMA==mid=408122444idx=2sn=ae6f3ddd
网页链接:https://mp.weixin.qq.com/s?__biz=MzA3ODY0MzEyMA==&mid=408122444&idx=2&sn=ae6f3ddddf ...
- 微信小程序报错 http://localhost:8084 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/a
http://localhost:8084 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/netwo ...
- https://mp.weixin.qq.com/s/j7YdtmyuzBFRK1BViDtp2w
干货 | Elasticsearch多表关联设计指南 0.题记 Elasticsearch多表关联问题是讨论最多的问题之一,如:博客和评论的关系,用户和爱好的关系. 多表关联通常指:1对多,或者多对多 ...
- https://mp.weixin.qq.com/s/ilO6DZwRpWdrruKm4J8CMw
近日安全漏洞频发,小编在此收集了近期大家会比较关注的漏洞,做个总结,供大家查漏补缺,若有缺失,欢迎留言补充. 目录 一.OA系统 二.E-mail 三.Web中间件 四.源代码管理 五.项目管理系统 ...
- CENTOS6.5安装CDH5.12.1(一) https://mp.weixin.qq.com/s/AP_m0QqKgzEUfjf0PQCX-w
CENTOS6.5安装CDH5.12.1(一) 原创: Fayson Hadoop实操 2017-09-13 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.概述 本文档主要描 ...
- https://api.douban.com 不在以下 request 合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/net
微信小程序报错: 解决方案: 一.点开工具,并选择项目详情 . 二.勾中选项即可
最新文章
- [20160910]低级错误.txt
- batch_size 和 fetch_size作用
- pandas DataFrame isin
- OpenCV、OpenCL、OpenGL、OpenPCL
- php编译成二进制文件_2020年小米高级 PHP 工程师面试题
- 发现很多人的基础都不好
- 2018CES智能硬件与新技术盘点
- WaveShaperNode
- laravel services.php,「Laravel框架中使用Service模式」- 海风纷飞Blog
- 火狐插件 打开html 死机,Firefox火狐Flash插件卡死问题完美解决方法
- 盛迈坤电子商务:网店有哪些营销活动
- C语言:memcmp()---字符串比较
- 用小鸟云服务器搭建网站常用的伪静态设置规则
- CSS3炫酷发光文字 ,自定义色彩
- java_vinson_02:jdk下载安装
- 58同城运维开发-BASE北京
- 【飞鱼科技】最新社招信息
- 网管软件哪家比较好用
- 百度最强大脑在想什么? —— 36氪硅谷专访百度首席科学家 Andrew Ng
- 微念入局螺蛳粉餐饮供应链,或成下一个颐海、蜀海
热门文章
- 每日整理Python基础——python教程入门学习
- 厉害了,比Transformer还好用!
- 收藏 | 李飞飞经典CS231N《卷积神经网络视觉识别》第十一讲!
- mysql无损复制_MySQL无损复制(转)
- 字符编码看不懂你来打我!(ASCII,Unicode,Utf-8,GB2312…)
- 基于Opencv--图像上采样
- syntaxnet python调用
- 滴滴人脸识别申诉照片怎么拍_涅槃乐队Nevermind封面照片是怎么拍出来的?
- 湖首大学计算机科学硕士申请,湖首大学王牌专业之一丨计算机科学专业
- java 2个小数点_在java程序中取后面两个小数点的方法