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中reload(module)的用法示例详解
Sep 15 Python
Python pymongo模块常用操作分析
Sep 01 Python
详解Python基础random模块随机数的生成
Mar 23 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
Python实现TCP通信的示例代码
Sep 09 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python实现堆排序的实例讲解
Feb 21 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Python turtle实现贪吃蛇游戏
Jun 18 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
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
php阳历转农历优化版
2016/08/08 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python中List.index()方法的使用教程
2015/05/20 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
几个Shell Script面试题
2012/08/31 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
委托书的样本
2015/01/28 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis