DRF 三大认证之身份认证
2024-09-04 22:38:08
目录
路由组件补充
重写路由用来配置mappings
自定义路由需要导入Route, DynamicDetailRoute, SimpleRouter
三大认证
一、身份认证
用户分类:合法、游客、非法
1、如何进行身份认证
使用jwt认证规则。
jwt:json、web、token
优点:
- 数据库不需要储存token,所以服务器的IO操作会减少;
- 客户端存token,服务器只存储签发与校验算法,执行效率高;
- 签发与校验算法在多个服务器上可以统一,所以jwt认证规则下,服务器做集群可以非常便捷。
注意点:
- token必须要有多个部分组成,有能反解的部分,也有不能反解的部分。
- jwt都是三段式
- token中必须包含过期时间保证token的安全性与时效性(过期时间);
2、jwt认证规则原理
- jwt由
头.载荷.签名
三部分组成; - 每一部分数据都是一个json字典,头和载荷采用
base64
可逆加密算法加密;签名采用哈希HS256
,不可逆加密。
3、jwt的组成
头(基本信息):可逆或不可逆采用的加密算法、公司名称、项目组信息、开发者信息
{
"company":"百度",
"...":"..."
}
载荷(核心信息):用户主键、用户账号、客户端设备信息、过期时间。。。
{
'pk':1,
'...':'...'
}
签名(安全信息):头的加密结果、服务器的安全码(盐)。。。
{
'header':'...',
'...':'...'
}
4、jwt的使用方法
4.1 签发算法
- 头内容写死(可以为空{}),公司、项目组信息都是固定不变的。
- 将数据字典转换成json字符串,再将json字符串加密成base64字符串。
- 载荷的内容,用户账号、客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验user表通过后才能确定,过期时间根据当前时间与配置的过期时长相结合产生;
- 将数据字典转换成json字符串,再将json字符串加密成base64字符串。
- 签名的内容,先将头的加密结果,载荷的加密结果作为成员,再从服务器上拿安全码(不能让任何客户端知道),也可以额外包含载荷中的部分(用户信息、客户端设备信息)。
- 将数据字典转换成json字符串,再将json字符串不可逆加密成HS256字符串。
- 将三个字符串用
.
连接产生三段式token。
4.2 校验算法
- 从客户端提交的请求中拿到token,用
.
分割成三段(如果不是三段,即为非法)。 - 第一段为头,可以不解密。
- 第二段是载荷,一定需要解密,先用base64解密成json字符串,再转换成python字典数据,进行信息校验:
- 通过用户主键与用户账号查询user表确定用户是否存在;
- 设备信息用本次请求提交的设备信息比对,确定前后是否是统一设备,决定是否对用户发送安全提示(短信、邮箱提示异地登录);IP、登陆地点同理;
- 过期时间与当前时间比对,该token是否在有效时间内;
- 第三段是签名,采用加密碰撞校验:
- 同样将头、载荷、加密字符串和数据库安全码形成json字典,转换成json字符串;
- 采用不可逆哈希HS256形成加密字符串
- 新的加密字符串与第三段签名碰撞比对,一致才能确认token为合法的。
- 前方算法都通过后,载荷校验得到的user对象,就是该token代表的用户(Django项目一般都会把登录用户放在request.user中)
4.3 刷新算法
- 要在签发token的载荷中,额外添加两个时间信息:
- 第一次签发token的时间;
- token的有效时间。
- 每次请求携带token,不仅走校验算法验证token是否合法,还要额外请求刷新token的接口,完成token的刷新。校验规则与校验算法差不多,但是要将过期时间后移(如果没有超过有效时间,则产生新token返回给客户端;如果超过了,就刷新失败,就要重新登录)。
- 所以服务器不仅要配置过期时间,还需配置最长刷新时间。
二、权限认证
三、节流认证(频率认证)
最新文章
- json 使用 (下)
- .net比较完美的动态注册com组件
- XML解析之DOM详解及与SAX解析方法的比较
- OK335xS dhcpcd porting
- 用javascript 面向对象制作坦克大战(三)
- “DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常
- Chrome测试网站加载时间与流量消耗
- Centos中安装Sublime编辑器
- Qt 释放新建窗口资源
- ASP.NET Zero--10.一个例子(3)商品分类管理-新建
- 数组的map方法
- TableView的性能优化
- maven 打包Could not resolve dependencies for project和无效的目标发行版: 1.8
- Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结
- ORACLE安装报错解决
- python tuple的函数
- delphi ios info.plist
- Haskell语言学习笔记(34)System.Environment
- 【IOI 2018】Highway 高速公路收费
- 如何分析Java虚拟机死锁
热门文章
- CCF计算机软件能力认证试题练习:201912-5 魔数
- BZOJ 3675: 序列分割 (斜率优化dp)
- python实现通过指定浏览器免费观看vip视频
- Educational Codeforces Round 88 (Rated for Div. 2) B、New Theatre Square C、Mixing Water
- 牛客编程巅峰赛S2第7场 - 钻石&;王者 A.牛牛的独特子序列 (字符串,二分)
- 仿ATM程序软件
- UVA 10480 Sabotage (最大流) 最小割边
- Codeforces Global Round 9 A. Sign Flipping (构造)
- acm的做题技巧
- Leetcode(144)-二叉树的前序遍历