一、JWT原理:

  参考文章:https://www.jianshu.com/p/180a870a308a

  1、传统的登录方式:

    浏览器输入用户名密码,服务端校验通过,根据用户信息生成一个token,将token和user_id存到数据库或者session中,并将token返回给前端,存入cookie,后面浏览器每次请求都会带上cookie,服务端根据cookie查询用户,验证用户有效性。

    弊端:

      1)如果出现XSS(跨站脚本攻击)漏洞,由于cookie可以被js读取,XSS漏洞会导致用户token被泄露。

       解决方案:

        a)设置httpOnly,这样的话cookie将不会被js读取,浏览器会自动将它加到请求头信息中,但是带来了新的问题,很容易被XSRF(跨站请求伪造)攻击,因为只要当前浏览器开着,另一个界面可以很容易的跨站请求这个界面的内容,因为cookie会被默认发送出去。

        b)设置secure,这样cookie就只能通过https传输,可以过滤掉一些使用http协议请求的XSS注入。

      2)将验证信息存到数据库中,每次验证的时候,都需要去数据库中查询,增加了数据库的查询和存储开销。

      3)如果将token存到session中,也会增加服务器的存储压力。

  2、为什么使用 JWT

    1)可以通过URL POST参数或者http header中发送,数据量小,传输速度快。

    2)自包含:负载中包含了用户所需要的所有信息,避免多次查询数据库。

    3)JWT组成:

      header+payload+signature 三者通过点【.】连接起来就是JWT了。

      

      a)header头部:包含token类型和采用的加密算法

        {"alg":"HS256", "typ":"JWT"}

      b)payload负载:存放信息的地方,可以把用户ID等信息存放在payload中。

        常用的信息有:iss(签发者), exp(过期时间), sub(面向用户), aud(接收方), iat(签发时间)等。

      c)signature签名:使用编码后(base64编码)的header和payload再加上我们提供的一个公钥,然后使用header中指定的签名算法进行签名。作用是保证JWT没有被窜改过。

      JWT只适合向web端传递一些非敏感信息,因为base64编码是可逆的,很容易被破解。

      JWT通常用来设计用户认证和授权系统,还有我们通常说的单点登录等。

二、JWT的使用过程

        

  1)前端通过表单将用户名和密码发送到后端接口。

  2)后端核对用户名和密码后,将用户的id及其他非敏感信息作为JWT Payload,将其与头部分别进行base64编码后签名,生成JWT

    具体源代码见rest_framework_jwt下面的serializer中,有兴趣研究的可以去跟踪看看

    

  3)后端将JWT字符串作为登录成功的结果返回给前端,前端可以将JWT存到localStorage或者sessionStorage中,退出登录时,前端删除保存的JWT信息即可。

  4)前端每次在请求时,将JWT放到header中的Authorization

  5)后端验证JWT的有效性

  6)验证通过后,进行其他逻辑操作。

三、JWT使用方法:

  1、安装

    pip install djangorestframework-jwt

  2、将JSONWebTokenAuthentication加到settings.py中的DEFAULT_AUTHENTICATION_CLASSES中,它可以将用户post过来的数据进行验证,并将user取出来,它和MIDDLEWARE中的AuthenticationMiddleware的原理是一样的。

    

  3、配置JWT的认证接口的url

    from djangorestframework-jwt.views import obtain_jwt_token

    url(r"^login$", obtain_jwt_token)

  4、前端访问 login,传入用户名和密码,服务器会给浏览器返回一段token(jwt)

    {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1MzEzNzU4NjEsImVtYWlsIjoiMzcwMTkzNTkzQHFxLmNvbSIsInVzZXJuYW1lIjoiYWRtaW4ifQ.BIl1b68VV-LvZOu-wrUeMxUFI3IREapgqfbTtzB6Ftw"}

  5、在后面的请求中,将JWT token信息 加入到header中的authorization中。

  6、扩展:

    DRF默认是通过邮箱作为用户名来登录的,所以如果我们是通过手机或者其他方式登录的话,需要重写DRF的认证方式。

    from django.db.models import Q

    from django.contrib.auth.backends import ModelBackend

    from django.contrib.auth import get_user_model

    User = get_user_model()

    class CustomBackend(ModelBackend):

      def authenticate(self, request, username=None, password=None, **kwargs):

        try:

          user = User.objects.get(Q(username=username) | Q(mobil = username))

          if user.check_password(password):

            return user

          else:

            return None

        except Exception as e:

          return None

  7、将重写的CustomBackend加入到settings中

    

  8、JWT的额外设置:

    

JWT认证原理及使用的更多相关文章

  1. Django(65)jwt认证原理

    前言 带着问题学习是最有目的性的,我们先提出以下几个问题,看看通过这篇博客的讲解,能解决问题吗? 什么是JWT? 为什么要用JWT?它有什么优势? JWT的认证流程是怎样的? JWT的工作原理? 我们 ...

  2. 使用python实现后台系统的JWT认证(转)

    今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认 ...

  3. JSON Web Token(JWT)原理和用法介绍

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.今天给大家介绍一下JWT的原理和用法. 官网地址:https://jwt.io/ 一.跨域身份验证 Internet服务无法与 ...

  4. JWT 认证 以及Django 中的应用

    jwt 认证 私钥.公钥.CA认证 用一套加密规则 加密和解密 RSA加密 (非对称的加密) 摘要算法:MD5 FTP/互联网下载软件校验MD5 私钥 --RSA算法-->公钥 RSA原理 加密 ...

  5. python实现后台系统的JWT认证

    介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认证是判定用 ...

  6. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  7. 一分钟带你了解JWT认证!

    目录 一.JWT简介 二.JWT认证和session认证的区别 三.JWT认证流程 四.JWT组成 五.JWT使用场景 一.JWT简介 JSON Web Token(JWT)是一个开放的标准(RFC ...

  8. jwt的原理以及使用

    jwt原理(json web token) 我们之前是使用session实现登录,通过实际密码+盐组成字符串进行md5存入redis或者数据库中,输入的密码与实际校验通过,发送给客户端一个有效时间的t ...

  9. 频率类组件-认证规图分析-JWT认证-drf-jwt插件

    频率类源码 # 1)APIView的dispath方法中的 self.initial(request, *args, **kwargs) 点进去 # 2)self.check_throttles(re ...

随机推荐

  1. pjsip 播放音视频

    http://blog.csdn.net/leixiaohua1020/article/details/40246783 onCallMediaState回调里,解码方向,获取ci.media[i]. ...

  2. WebRTC 简介及服务搭建、测试

    WebRTC主要解决如下三个问题 1.获取音频和视频. 可以访问输入设备,如话筒.(网络)摄像机(头),可以从上述设备获取媒体数据流.目前需要硬件设备支持VP8/VP9,如果设备仅仅支持H.264/H ...

  3. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  4. c/c++ 数组和指针

    c/c++ 数组和指针 知识点 1,数组就是指针,对应代码里的test1 2,用auto声明,得到的是指针,对应代码里的test2 3,用decltype声明,得到的不是指针 ,对应代码里的test3 ...

  5. 4.4Python数据处理篇之Matplotlib系列(四)---plt.bar()与plt.barh条形图

    目录 目录 前言 (一)竖值条形图 (二)水平条形图 1.使用bar()绘制: 2.使用barh()绘制: (三)复杂的条形图 1.并列条形图: 2.叠加条形图: 3.添加图例于数据标签的条形图: 目 ...

  6. orcFile split和读数据原理总结(hive0.13)

    http://blog.csdn.net/zhaorongsheng/article/details/72903431 官网关于orcfile的介绍 背景 Hive的rcfile格式已经使用多年,但是 ...

  7. 用js检测文本框中输入的是否符合条件并有错误和正确提醒

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 设计模式のInterpreter Patern(解释器模式)----行为模式

    一.问题产生背景 有一句话“小明和小龙是好朋友”,我想分析其中谁是人,我想分析他们的关系等多种需求,那么我们应该如何处理,如果为每一个关系都进行判断?显然不合适,我们可以将二者的关系进行抽象处理,然后 ...

  9. 15.selenium_case01

    # 与百度首页交互 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait f ...

  10. 学习任务,阅读一下Redis分布式锁的官方文档

    地址: https://redis.io/topics/distlock 这是一篇质疑RedLock的论文:https://martin.kleppmann.com/2016/02/08/how-to ...