路由组件补充

重写路由用来配置mappings

自定义路由需要导入Route, DynamicDetailRoute, SimpleRouter

三大认证

一、身份认证

用户分类:合法、游客、非法

1、如何进行身份认证

使用jwt认证规则。

jwt:json、web、token

优点:

  1. 数据库不需要储存token,所以服务器的IO操作会减少;
  2. 客户端存token,服务器只存储签发与校验算法,执行效率高;
  3. 签发与校验算法在多个服务器上可以统一,所以jwt认证规则下,服务器做集群可以非常便捷。

注意点:

  1. token必须要有多个部分组成,有能反解的部分,也有不能反解的部分。

    • jwt都是三段式
  2. token中必须包含过期时间保证token的安全性与时效性(过期时间);

2、jwt认证规则原理

  1. jwt由头.载荷.签名三部分组成;
  2. 每一部分数据都是一个json字典,头和载荷采用base64可逆加密算法加密;签名采用哈希HS256,不可逆加密。

3、jwt的组成

  1. 头(基本信息):可逆或不可逆采用的加密算法、公司名称、项目组信息、开发者信息

    {
    "company":"百度",
    "...":"..."
    }
  2. 载荷(核心信息):用户主键、用户账号、客户端设备信息、过期时间。。。

    {
    'pk':1,
    '...':'...'
    }
  3. 签名(安全信息):头的加密结果、服务器的安全码(盐)。。。

    {
    'header':'...',
    '...':'...'
    }

4、jwt的使用方法

4.1 签发算法

  1. 头内容写死(可以为空{}),公司、项目组信息都是固定不变的。

    • 将数据字典转换成json字符串,再将json字符串加密成base64字符串。
  2. 载荷的内容,用户账号、客户端设备信息是由客户端提供,用户主键是客户端提供账号密码校验user表通过后才能确定,过期时间根据当前时间与配置的过期时长相结合产生;
    • 将数据字典转换成json字符串,再将json字符串加密成base64字符串。
  3. 签名的内容,先将头的加密结果,载荷的加密结果作为成员,再从服务器上拿安全码(不能让任何客户端知道),也可以额外包含载荷中的部分(用户信息、客户端设备信息)。
    • 将数据字典转换成json字符串,再将json字符串不可逆加密成HS256字符串。
  4. 将三个字符串用.连接产生三段式token。

4.2 校验算法

  1. 从客户端提交的请求中拿到token,用.分割成三段(如果不是三段,即为非法)。
  2. 第一段为头,可以不解密。
  3. 第二段是载荷,一定需要解密,先用base64解密成json字符串,再转换成python字典数据,进行信息校验:
    • 通过用户主键与用户账号查询user表确定用户是否存在;
    • 设备信息用本次请求提交的设备信息比对,确定前后是否是统一设备,决定是否对用户发送安全提示(短信、邮箱提示异地登录);IP、登陆地点同理;
    • 过期时间与当前时间比对,该token是否在有效时间内;
  4. 第三段是签名,采用加密碰撞校验:
    • 同样将头、载荷、加密字符串和数据库安全码形成json字典,转换成json字符串;
    • 采用不可逆哈希HS256形成加密字符串
    • 新的加密字符串与第三段签名碰撞比对,一致才能确认token为合法的。
  5. 前方算法都通过后,载荷校验得到的user对象,就是该token代表的用户(Django项目一般都会把登录用户放在request.user中)

4.3 刷新算法

  1. 要在签发token的载荷中,额外添加两个时间信息:

    • 第一次签发token的时间;
    • token的有效时间。
  2. 每次请求携带token,不仅走校验算法验证token是否合法,还要额外请求刷新token的接口,完成token的刷新。校验规则与校验算法差不多,但是要将过期时间后移(如果没有超过有效时间,则产生新token返回给客户端;如果超过了,就刷新失败,就要重新登录)。
  3. 所以服务器不仅要配置过期时间,还需配置最长刷新时间。

二、权限认证

三、节流认证(频率认证)

最新文章

  1. json 使用 (下)
  2. .net比较完美的动态注册com组件
  3. XML解析之DOM详解及与SAX解析方法的比较
  4. OK335xS dhcpcd porting
  5. 用javascript 面向对象制作坦克大战(三)
  6. “DBUtility.DbHelperSQL”的类型初始值设定项引发异常 “DBUtility.DbHelperSQL”的类型初始值设定项引发异常
  7. Chrome测试网站加载时间与流量消耗
  8. Centos中安装Sublime编辑器
  9. Qt 释放新建窗口资源
  10. ASP.NET Zero--10.一个例子(3)商品分类管理-新建
  11. 数组的map方法
  12. TableView的性能优化
  13. maven 打包Could not resolve dependencies for project和无效的目标发行版: 1.8
  14. Android网络传输中必用的两个加密算法:MD5 和 RSA 及Base64加密总结
  15. ORACLE安装报错解决
  16. python tuple的函数
  17. delphi ios info.plist
  18. Haskell语言学习笔记(34)System.Environment
  19. 【IOI 2018】Highway 高速公路收费
  20. 如何分析Java虚拟机死锁

热门文章

  1. CCF计算机软件能力认证试题练习:201912-5 魔数
  2. BZOJ 3675: 序列分割 (斜率优化dp)
  3. python实现通过指定浏览器免费观看vip视频
  4. Educational Codeforces Round 88 (Rated for Div. 2) B、New Theatre Square C、Mixing Water
  5. 牛客编程巅峰赛S2第7场 - 钻石&王者 A.牛牛的独特子序列 (字符串,二分)
  6. 仿ATM程序软件
  7. UVA 10480 Sabotage (最大流) 最小割边
  8. Codeforces Global Round 9 A. Sign Flipping (构造)
  9. acm的做题技巧
  10. Leetcode(144)-二叉树的前序遍历