一,认证

1,Brosable API页面认证与JWT认证比较

1.Browsable API页面认证

  • 指定permission_classes
  • 添加rest_framework.urls路由

2.Json Web Token认证

  • 最常用的认证方式
    • Session认证
    • Token认证
  • Session认证
    • 保存在服务端,增加服务器开销
    • 分布式架构中,难以维持Session会话同步
    • CSRF攻击风险
  • Token认证
    • 保存在客户端
    • 跨语言、跨平台
    • 拓展性强
    • 鉴权性能高
  • JWT

    • 由三部分组成
      • header、playload、signatur
        1. eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhemF6aWUiLCJhdWQiOiJ1c2VycyIsImlhdCI6MTU5NTY3NTA1NiwiZXhwIjoxNTk2Mjc5ODU2LCJ1c2VyX2lkIjozMDI3NTQxfQ.vJPcwpw4_WBLGBkXO3SUPbyfgDzk4S3FwWzJrCtvhwA
  • header

    • 声明类型
    • 声明加密算法,默认为HS256
    • base64加密,可以解密
  • playload
    • 存放过期时间、签发用户等
    • 可以添加用户的非敏感信息
    • base64加密,可以解密
  • signature

    • 有三部分组成
    • 使用base64加密之后的header+.+使用base64加密之后的playload+.+使用HS256算法加密,同时secret加盐处理

      2.Browsable API页面认证

      1,源码

      1. 'DEFAULT_AUTHENTICATION_CLASSES': [
      2. 'rest_framework.authentication.SessionAuthentication',
      3. 'rest_framework.authentication.BasicAuthentication'
      4. ]

      2,说明

  • BasicAuthentication:基本的用户密码认证

  • SessionAuthentication:session会话认证
  • SessionAuthentication和BasicAuthentication二者缺一不可,相辅相成,我们也可以在此基础上增加别的认证,如:token认证、微信/QQ第三方认证、LADP认证

在authentication.py模块中,除了上面这两种,还有其它的认证方式可供选择:
DRF-认证,授权,登录 - 图1

3,指定视图下认证

  1. authenticcation_classes = [] # 列表中添加对应的认证方式

一般不需要指定视图下进行认证,往往一个项目下只会使用一种认证方式

4,创建超级管理员

命令行

  1. python manage.py createsuperuser --username USERNAME --email EMAIL

DRF-认证,授权,登录 - 图2

DRF-认证,授权,登录 - 图3

5,添加路由

这里提供的是一种前后端不分离的登录,后面会舍弃掉
在全局下的urls.py中添加如下代码

  1. from django.contrib import admin
  2. from django.urls import path, include
  3. urlpatterns = [
  4. path('admin/', admin.site.urls),
  5. path('api/', include('rest_framework.urls'))
  6. ]

我们可以去看看rest_framework下的urls.py
DRF-认证,授权,登录 - 图4
配置了之后就已经提供了登录和登出的接口

6,登录

DRF-认证,授权,登录 - 图5

3,JWT认证

1,jwt实现原理

  • 安装jwt

    1. pip install -i https://pypi.douban.com/simple pyjwt
  • 引入jwt

    1. import jwt
  • 指定header和playload

header一般不需要指定,使用默认值即可
指定后端要存放的一些非敏感信息

  1. playload = {
  2. 'username': 'ADDICATED',
  3. 'age': 26
  4. }
  • 服务端创建token令牌

    1. token = jwt.encode(playload, key='user') # key由服务器来规定

    DRF-认证,授权,登录 - 图6

  • 服务端对前端用户传来的token进行解密

    1. res = jwt.decode(token, key='user')

    DRF-认证,授权,登录 - 图7

    2,DRF的token认证实现方法

  • 安装djangorestframework-jwt

    1. pip install -i https://pypi.douban.com/simple djangorestframework-jwt
  • 全局配置指定JWT Token认证

一定要注意列表是有优先级的,需要把该认证放到第一个位置

  1. REST_FRAMEWORK = {
  2. # 认证方式
  3. 'DEFAULT_AUTHENTICATION_CLASSES': [
  4. 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
  5. 'rest_framework.authentication.SessionAuthentication',
  6. 'rest_framework.authentication.BasicAuthentication'
  7. ]
  8. }
  • 根据路由配置user模块 ```python from django.contrib import admin from django.urls import path, include

urlpatterns = [ path(‘admin/‘, admin.site.urls), path(‘user/‘, include(‘user.urls’)) ]

  1. - USER子模块下添加路由
  2. ```python
  3. from django.urls import path
  4. from rest_framework_jwt.views import obtain_jwt_token
  5. urlpatterns = [
  6. path('login/', obtain_jwt_token)
  7. ]
  • 验证结果

DRF-认证,授权,登录 - 图8

  • 重写jwt_response
  • 1).重写jwt_response_payload_handler

    def jwt_response_payload_handler(token, user=None, request=None):
    
      return {
          'user_id': user.id,
          'username': user.username,
          'token': token
      }
    
  • 2).注册重写的方法

将rest_framework_jwt中的全局配置进行覆盖,源码配置如下:
DRF-认证,授权,登录 - 图9

  • 3).在全局配置中重写配置
    JWT_AUTH = {
      'JWT_RESPONSE_PAYLOAD_HANDLER':
      'utils.jwt_handler.jwt_response_payload_handler'
    }
    

    二,授权