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入门篇之编程习惯与特点
Oct 17 Python
用Python代码来解图片迷宫的方法整理
Apr 02 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Django之无名分组和有名分组的实现
Apr 16 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
python中如何写类
Jun 29 Python
Python日志器使用方法及原理解析
Sep 27 Python
python通过函数名调用函数的几种方法总结
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
php split汉字
2009/06/05 PHP
php 高效率写法 推荐
2010/02/21 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
PHP session 会话处理函数
2016/06/06 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
Node.js实现数据推送
2016/04/14 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
基于python的Tkinter编写登陆注册界面
2017/06/30 Python
python爬虫爬取网页表格数据
2018/03/07 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
python+OpenCV实现图像拼接
2020/03/05 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
.NET程序员的几道面试题
2012/06/01 面试题
乡镇三项教育实施方案
2014/03/30 职场文书
研究生求职自荐书
2014/06/23 职场文书
本溪关门山导游词
2015/02/09 职场文书
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL