服务器如何验证jwt,RESTful API使用JWT做无状态的身份认证-Go语言中文社区
JWT设计
RESTful架构的前后端,天然要求API是无状态的,JWT(JSON Web Token)简单易用,适合在分布式系统中做API无状态的身份认证。
jwt由Header、Payload、Signature三部分组成,使用 . 分割开,一个JWT形式:
Header.Payload.Signature
这三部分分别对应的是加密算法、携带的用户信息、加密后的字符串(签名)。
jwt自带签名,能够防止伪造或篡改,但要防止token被窃取还要配合https使用。
下面我们用jwt开发一个前后端交互系统。
JWT服务端
这里使用jjwt开源库生成token:
Server端基于SpringBoot开发,提供生成token和校验token的接口:
@PostMapping("/login")
Back login(@RequestParam("name") String name,
@RequestParam("pwd") String pwd);
@GetMapping("/user")
Back getUser(@RequestHeader("jwt") String token);
用户名密码和用户信息通过JPA持久化到不同的MySQL数据库表中,通过用户id关联两张表
登录接口:客户端提交用户名密码,服务端返回jwt令牌,如:
eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4iLCJzdWIiOiI0MDI4Yjg4MTVmN2I0MmQxMDE1ZjdiNDQ4ZTZjMDAwMCIsImV4cCI6MTUxMDQ2NjEyMn0.U3UOe8Jc6HLE3hw8r6BSus8mr2q1mguo3jiFsLkvRf5jsNX2ibZzmJSVgGUmanNSN05Jrv6ZiBMmVbo-R5TYbg
用户信息接口:客户端将token放在请求头,服务端校验是否合法,然后通过JAP从MySQL中查询并返回用户信息
服务端无需存储jwt令牌,通过特定的算法和密钥校验token,同时取出Payload中携带的用户ID,减少不必要的数据库查询
本例中设置JWT有效期为10天,服务端每次都会自动校验token是否过期,如果过期就直接抛出异常,客户端需要重新申请token
JWT客户端
Android客户端使用Retrofit做REST请求。
登录接口:提交用户名密码,服务端返回jwt令牌:
用户信息接口:客户端将token放在请求头,服务端校验通过即返回用户信息
客户端在本地存储token以后就能免登陆
JWT的缺陷
JWT使用起来虽然简单方便,但它存在一个设计缺陷,即服务端无法主动注销token,所以jwt在安全性上不及session,实际开发中应谨慎使用。
如果要让服务端能够注销token,就要在服务端维持token状态,这又回到session机制了,所以在经常需要验证的场景中,建议还是使用session。
JWT这个缺陷决定了它更适合用在一次性token验证场景中,即token只使用一次就立即废弃掉,比如第三方登录授权。
扫一扫关注我的微信公众号
服务器如何验证jwt,RESTful API使用JWT做无状态的身份认证-Go语言中文社区相关推荐
- 服务器304响应,网络---关于HTTP 304状态码的理解-Go语言中文社区
有时候我们使用七牛过程中会遇到对浏览器缓存下请求资源返回304的情况流量的计费的情况,这里就需要了解HTTP 304的响应状态的资源更新机制. 首先看一个关于304请求的响应头的信息,这里面有两个比较 ...
- 如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分)
by Niharika Singh 由Niharika Singh 如何在5分钟内通过身份验证构建RESTful API -全部从命令行(第1部分) (How to Build a RESTful A ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.1 HTTP状态码
HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一共分为5个级别: ...
- SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类
所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息的泄漏,所以对于 Rest 访问,安全性是首要的因素. 2.1. ...
- 两台服务器身份验证,OAuth 2 从入门到精通(一) - 身份认证服务器
前言 创建认证服务 新建WebAPI项目 Framework 4.6,新建ASP.NET应用程序,选择"Empty","Web API","No Au ...
- go hive skynet_MMORPG游戏服务器技术选型参考-Go语言中文社区
游戏服务器一般追求稳定和效率,所以偏向于保守,使用的技术手段也是以已经过验证.开发人员最熟悉.能HOLD为主要前提. 1.典型按场景分服设计 开发语言: c++ 数据库:mysql 架构: 多个网关: ...
- go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区
aiohttp介绍 官网上有这样一句话介绍:Async HTTP client/server for asyncio and Python 翻译过来就是 基于asyncio和Python实现的异步HT ...
- gin 静态文件服务器拒绝,nginx实现简单的图片服务器(windows)+静态文件服务器-Go语言中文社区...
需求:能够使用 http://localhost/目录/图片名 访问本地(服务器)已经存在的图片 首先需要在本地将nginx跑起来,这里使用默认端口80: 在浏览器使用http://localhost ...
- java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...
1. 导入数据库 远程linux服务器mysql数据库导入和导出.sql文件 大部分情况本地开发环境为windows,部署的服务器为Linux,本地数据库导出.sql文件后需要远程导入服务器,具体如下 ...
最新文章
- linux .lz进程,LLinux常用命令(二)
- svd 分解详细证明
- Spring-AOP @AspectJ进阶之绑定连接点方法的返回值
- 深度学习-吴恩达-笔记-5-深度学习的实践层面
- php mysql 任务队列_PHP+MySQL实现消息队列步骤详解
- LeetCode-C#实现-二叉树/二叉搜索树(#98/104/111/230)
- java提高篇(四)-----抽象类与接口
- 数字0123456789对应的ASCII码值
- 如何在Linux里面安装Java的运行环境(详细过程)
- orcad的瞬态分析
- stm32f4定时器时钟频率/选择
- Cadence 17.4将状态栏由黑底白字改为白底黑字
- matlab某分子由25个原子组成,清华大学数学实验-实验7无约束优化1
- 2-1暴力破解原理和测试流程
- 没有灵感,青少年科技创新学生没有好点子怎么办?
- 有时,你需要宣扬你的野心
- C#中设置Excel单元格格式
- 全国精神病等级考试试题
- .Net MVC 图片合成、证书生成
- Python 爬取电影天堂top最新电影