Django JWT Token RestfulAPI用户认证详解


Posted in Python onJanuary 23, 2019

一般情况下我们Django默认的用户系统是满足不了我们的需求的,那么我们会对他做一定的扩展

创建用户项目

python manage.py startapp users

添加项目apps

settings.py

INSTALLED_APPS = [
 ...
 'users.apps.UsersConfig',

]
添加AUTH_USRE_MODEL 替换默认的user
AUTH_USER_MODEL = 'users.UserProfile'

如果说想用全局认证需要在配置文件中添加

# 全局认证from rest_framework.authentication import TokenAuthentication,BasicAuthentication,SessionAuthentication

REST_FRAMEWORK = {
 'DEFAULT_AUTHENTICATION_CLASSES': (
  # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 全局认证,开源jwt
  'rest_framework.authentication.BasicAuthentication',
  'rest_framework.authentication.SessionAuthentication',
  # 'rest_framework.authentication.TokenAuthentication', #全局认证drf 自带的

 )
}

编写model

扩展User model

from django.contrib.auth.models import AbstractUser
from django.db import models


class UserProfile(AbstractUser):
 """
 用户
 """
 name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
 birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
 gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female", verbose_name="性别")
 mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话")
 email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱")

 class Meta:
  verbose_name = "用户"
  verbose_name_plural = verbose_name

 def __str__(self):
  return self.username

编写serializers.py

from rest_framework import serializers
from users.models import VerifyCode

class VerifyCodeSerializer(serializers.ModelSerializer):
 class Meta:
  model = VerifyCode
  fields = "__all__"

编写views 动态验证不同的请求使用不同的验证

views.py测试

from django.shortcuts import render
from rest_framework import mixins, viewsets
from rest_framework.views import APIView
from users.models import VerifyCode

from .serializers import VerifyCodeSerializer
# Create your views here.
from rest_framework.authentication import TokenAuthentication,BasicAuthentication,SessionAuthentication

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
class VerifyCodeListViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin, viewsets.GenericViewSet):
 """
 验证码列表
 """
 queryset = VerifyCode.objects.all()
 serializer_class = VerifyCodeSerializer
 # authentication_classes = [TokenAuthentication, ]
 # authentication_classes = [JSONWebTokenAuthentication, ]
 # JWT 认证 加密,过期时间
 def get_authenticators(self):
  """
  Instantiates and returns the list of authenticators that this view can use.
  # 修改验证
  """
  # 动态认证
  print(self.authentication_classes)
  print([JSONWebTokenAuthentication, ])
  if self.action_map['get'] == "retrieve":
   self.authentication_classes = [BasicAuthentication,SessionAuthentication,]
  elif self.action_map['get'] == "list":
   self.authentication_classes = [JSONWebTokenAuthentication,]
  return [auth() for auth in self.authentication_classes]

 # DRF 自带的认证 不过期,易发生xss攻击
 # def get_authenticators(self):
 #  """
 #  Instantiates and returns the list of authenticators that this view can use.
 #  # 修改验证
 #  """
 #  print(self.authentication_classes)
 #  print([JSONWebTokenAuthentication, ])
 #  if self.action_map['get'] == "retrieve":
 #   self.authentication_classes = [BasicAuthentication,SessionAuthentication,]
 #  elif self.action_map['get'] == "list":
 #   self.authentication_classes = [JSONWebTokenAuthentication,]
 #  return [auth() for auth in self.authentication_classes]

 def get_queryset(self):

 # 取出认证信息
  print(self.request.auth)
  # print(self.action)
  return self.queryset
 # url

"""untitled URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
 https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
 1. Add an import: from my_app import views
 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
 1. Add an import: from other_app.views import Home
 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
 1. Import the include() function: from django.conf.urls import url, include
 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from rest_framework.authtoken import views
from rest_framework_jwt.views import obtain_jwt_token

from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from users.views import VerifyCodeListViewSet

router = routers.DefaultRouter()
router.register(r'codes', VerifyCodeListViewSet, 'codes')

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^api-auth/', include('rest_framework.urls'))

]
urlpatterns += [
 # drf 自带的
 url(r'^api-token-auth/', views.obtain_auth_token),
 # jwt 认证
 url(r'^jwt_auth/', obtain_jwt_token),
]
urlpatterns += router.urls

1. debug模式启动

Django JWT Token RestfulAPI用户认证详解

2. 使用postmain测试

Django JWT Token RestfulAPI用户认证详解

粘贴jwt token 到header中法功请求获取codes列表数据

Django JWT Token RestfulAPI用户认证详解

查看request 中的user可以看到用户代表成功request.auth 可以获得token

Django JWT Token RestfulAPI用户认证详解

调试结束后可以看到结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python开发编码规范
Sep 08 Python
Python 文件和输入输出小结
Oct 09 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
Python 使用生成器代替线程的方法
Aug 04 Python
python 实用工具状态机transitions
Nov 21 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 #Python
python实现年会抽奖程序
Jan 22 #Python
在python中实现强制关闭线程的示例
Jan 22 #Python
Python实现简单石头剪刀布游戏
Jan 20 #Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 #Python
python 对类的成员函数开启线程的方法
Jan 22 #Python
python实现石头剪刀布小游戏
Jan 20 #Python
You might like
PHP利用imagick生成组合缩略图
2016/02/19 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JS和函数式语言的三特性
2014/03/05 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python中list初始化方法示例
2016/09/18 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
python如何删除文件中重复的字段
2019/07/16 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python的缺点和劣势分析
2019/11/19 Python
Python命令行click参数用法解析
2019/12/19 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
静态变量和实例变量的区别
2015/07/07 面试题
中国梦团日活动总结
2014/07/07 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
教师党员整改措施
2014/10/24 职场文书
招商引资工作汇报
2014/10/28 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
python获取字符串中的email
2022/03/31 Python