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语言中文社区相关推荐

  1. 服务器304响应,网络---关于HTTP 304状态码的理解-Go语言中文社区

    有时候我们使用七牛过程中会遇到对浏览器缓存下请求资源返回304的情况流量的计费的情况,这里就需要了解HTTP 304的响应状态的资源更新机制. 首先看一个关于304请求的响应头的信息,这里面有两个比较 ...

  2. 如何在5分钟内通过身份验证构建RESTful API —全部从命令行(第1部分)

    by Niharika Singh 由Niharika Singh 如何在5分钟内通过身份验证构建RESTful API -全部从命令行(第1部分) (How to Build a RESTful A ...

  3. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.1 HTTP状态码

    HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一共分为5个级别: ...

  4. SpringCloud 配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类

    所有的 Rest 服务最终都是暴露在公网上的,也就是说如果你的 Rest 服务属于一些你自己公司的私人业务,这样的结果会直接 导致你信息的泄漏,所以对于 Rest 访问,安全性是首要的因素. 2.1. ...

  5. 两台服务器身份验证,OAuth 2 从入门到精通(一) - 身份认证服务器

    前言 创建认证服务 新建WebAPI项目 Framework 4.6,新建ASP.NET应用程序,选择"Empty","Web API","No Au ...

  6. go hive skynet_MMORPG游戏服务器技术选型参考-Go语言中文社区

    游戏服务器一般追求稳定和效率,所以偏向于保守,使用的技术手段也是以已经过验证.开发人员最熟悉.能HOLD为主要前提. 1.典型按场景分服设计 开发语言: c++ 数据库:mysql 架构: 多个网关: ...

  7. go vs python 对接外部web api_python--web--让python提供api服务--aiohttp-Go语言中文社区

    aiohttp介绍 官网上有这样一句话介绍:Async HTTP client/server for asyncio and Python 翻译过来就是 基于asyncio和Python实现的异步HT ...

  8. gin 静态文件服务器拒绝,nginx实现简单的图片服务器(windows)+静态文件服务器-Go语言中文社区...

    需求:能够使用 http://localhost/目录/图片名 访问本地(服务器)已经存在的图片 首先需要在本地将nginx跑起来,这里使用默认端口80: 在浏览器使用http://localhost ...

  9. java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...

    1. 导入数据库 远程linux服务器mysql数据库导入和导出.sql文件 大部分情况本地开发环境为windows,部署的服务器为Linux,本地数据库导出.sql文件后需要远程导入服务器,具体如下 ...

最新文章

  1. linux .lz进程,LLinux常用命令(二)
  2. svd 分解详细证明
  3. Spring-AOP @AspectJ进阶之绑定连接点方法的返回值
  4. 深度学习-吴恩达-笔记-5-深度学习的实践层面
  5. php mysql 任务队列_PHP+MySQL实现消息队列步骤详解
  6. LeetCode-C#实现-二叉树/二叉搜索树(#98/104/111/230)
  7. java提高篇(四)-----抽象类与接口
  8. 数字0123456789对应的ASCII码值
  9. 如何在Linux里面安装Java的运行环境(详细过程)
  10. orcad的瞬态分析
  11. stm32f4定时器时钟频率/选择
  12. Cadence 17.4将状态栏由黑底白字改为白底黑字
  13. matlab某分子由25个原子组成,清华大学数学实验-实验7无约束优化1
  14. 2-1暴力破解原理和测试流程
  15. 没有灵感,青少年科技创新学生没有好点子怎么办?
  16. 有时,你需要宣扬你的野心
  17. C#中设置Excel单元格格式
  18. 全国精神病等级考试试题
  19. .Net MVC 图片合成、证书生成
  20. Python 爬取电影天堂top最新电影

热门文章

  1. 我叫mt世界服务器维护,我叫mt世界变态版,我叫MT世界什么职业
  2. Fiddler服务器数据抓包
  3. 图片广告自适应代码html,使用自适应模板网站添加广告自适应的方法(DIV+CSS控制)...
  4. JSON Schema的应用(具体的使用场景)
  5. 设置静态全局变量 oc swift
  6. 研发职位到底应该怎么设置?
  7. 单博老师的论文经验公开课
  8. 互联网装比大法!!!
  9. 软件工程 UML 10种图
  10. 【Python】【图像处理】图片压缩方法