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的Twisted框架编写简单的网络客户端
Apr 16 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
Jun 04 Python
对python中的argv和argc使用详解
Dec 15 Python
Python用字典构建多级菜单功能
Jul 11 Python
Python实现CNN的多通道输入实例
Jan 17 Python
np.dot()函数的用法详解
Jan 17 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python+adb+monkey实现Rom稳定性测试详解
Apr 23 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 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+javascript的日历控件
2009/11/19 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php查询ip所在地的方法
2014/12/05 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
python多线程抽象编程模型详解
2019/03/20 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
思想政治自我鉴定
2013/10/06 职场文书
化工专业推荐信范文
2013/11/28 职场文书
工作表扬信的范文
2014/01/10 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书