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中方法链的使用方法
Feb 23 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
python筛选出两个文件中重复行的方法
May 31 Python
对Python中for复合语句的使用示例讲解
Nov 01 Python
Python元组知识点总结
Feb 18 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
python 爬虫请求模块requests详解
Dec 04 Python
python tkinter实现定时关机
Apr 21 Python
浅谈Python类的单继承相关知识
May 12 Python
python单元测试之pytest的使用
Jun 07 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
python求众数问题实例
2014/09/26 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
董事长秘书岗位职责
2013/11/29 职场文书
转让协议书范本
2014/09/13 职场文书
甜品店创业计划书
2014/09/21 职场文书
2014年健康教育工作总结
2014/11/20 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS