Django REST Framework——8. JWT

文章目录

  • 一、Token与Session
    • 1. Session的弊端
    • 2. Token认证机制
  • 二、JWT的概念及构成
  • 三、Djangorestframework-simplejwt
    • 1. 安装与配置
    • 2. 基本使用方法
    • 3. 常用配置
    • 4. 自定义生成的Token内容
    • 5. JWT解码

一、Token与Session

1. Session的弊端

我们之前已经学过session,它是将用户的敏感信息保存到服务端,而只给客户端一个sessionid(保存为cookie)作为与服务器端session交互的凭证。在用户通过验证并拿到sessionid后,几乎每次访问都需要携带sessionid,并需要服务端每次都从数据库中获取session信息。这就暴露了如下的弊端:

  • 需要频繁查询数据库中的session,服务器压力大。

  • session是基于cookie的,如果cookie被截获,容易遭到CSRF攻击。

  • session被保存在用户第一次访问的服务器中(一般在内存中),如果有多个服务器,其他服务器无法获取到这些session信息,所以扩展性差。

2. Token认证机制

  1. 用户通过验证后,由服务端对数据进行编码;

  2. 将加密后的数据保存到客户端,称为Token:由js进行读写,保存在Local Storage中;

  3. 以后再访问服务端时,附带Token,服务端进行验证、解码。

如此,便减小了服务端的压力,由于不依赖于cookie,所以无需担心CSRF攻击。并且,Token由客户端发送,不依赖于某一台服务器,所以扩展性很好。

二、JWT的概念及构成

JWT的全称为JSON Web Token,它是一个开放的标准,定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。

JWT的本质就是一个字符串,它将用户信息保存到JSON字符串中,然后进行BSEA64编码,并附带一个签名(Signature),防止信息被篡改

JWT看起来就是下面这样,因为是编码后的,所以是一堆乱七八糟的字符:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

它由三部分构成:

  1. Header(头部):通常包含token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)以及其他信息。

  2. Payload(载荷):是JWT的主体,通常包含用户主键、用户名、签发时客户信息(设备号、地址)、过期时间等。

    注意:因为BASE64是可逆的,所以不要在JWT的payload或header中放置敏感信息,除非它们是加密的!

  3. Signature(签名):是对上面两部分编码后的内容再进行加密后得到的密文。即:base64(Header)+"."+base64(Payload)通过SHA256加密后,得到的密文就是签名。

最后,将上面三部分通过.连接起来就得到了JWT。

三、Djangorestframework-simplejwt

Djangorestframework-simplejwt是DRF(django rest framework)的一个JWT认证插件,为DRF提供了一个JWT认证后端。

1. 安装与配置

  • 使用pip安装:

    pip install djangorestframework-simplejwt
    
  • 全局配置:

    在项目配置文件settings.py中,将JWTAuthentication添加到认证后端列表:

    REST_FRAMEWORK = {
         
        ...
        'DEFAULT_AUTHENTICATION_CLASSES': (
            ...
            'rest_framework_simplejwt.authentication.JWTAuthentication',    
        )    
        ... 
    }
    
  • 局部配置:

    或者,仅在需要的视图中配置:

    class UserCenterView(GenericAPIView):
        authentication_classes = [JWTAuthentication]
        ……
    
  • 添加路由:

    from rest_framework_simplejwt.views import 

你可能感兴趣的:(django框架,django,服务器,安全,jwt,restful)