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

创建用户项目

  1. python manage.py startapp users

添加项目apps

  1. INSTALLED_APPS = [
  2. ...
  3. 'users.apps.UsersConfig',
  4.  
  5. ]
  6. 添加AUTH_USRE_MODEL 替换默认的user
  7. AUTH_USER_MODEL = 'users.UserProfile'
  8.  
  9. 如果说想用全局认证需要在配置文件中添加
  10.  
  11. # 全局认证from rest_framework.authentication import TokenAuthentication,BasicAuthentication,SessionAuthentication
  12.  
  13. REST_FRAMEWORK = {
  14. 'DEFAULT_AUTHENTICATION_CLASSES': (
  15. # 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 全局认证,开源jwt
  16. 'rest_framework.authentication.BasicAuthentication',
  17. 'rest_framework.authentication.SessionAuthentication',
  18. # 'rest_framework.authentication.TokenAuthentication', #全局认证drf 自带的
  19.  
  20. )
  21. }

settings.py

编写model

  1. from django.contrib.auth.models import AbstractUser
  2. from django.db import models
  3.  
  4. class UserProfile(AbstractUser):
  5. """
  6. 用户
  7. """
  8. name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
  9. birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
  10. gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female", verbose_name="性别")
  11. mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话")
  12. email = models.EmailField(max_length=100, null=True, blank=True, verbose_name="邮箱")
  13.  
  14. class Meta:
  15. verbose_name = "用户"
  16. verbose_name_plural = verbose_name
  17.  
  18. def __str__(self):
  19. return self.username

扩展User model

编写serializers.py

  1. from rest_framework import serializers
  2. from users.models import VerifyCode
  3.  
  4. class VerifyCodeSerializer(serializers.ModelSerializer):
  5. class Meta:
  6. model = VerifyCode
  7. fields = "__all__"

serializers.py

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

  1. from django.shortcuts import render
  2. from rest_framework import mixins, viewsets
  3. from rest_framework.views import APIView
  4. from users.models import VerifyCode
  5.  
  6. from .serializers import VerifyCodeSerializer
  7. # Create your views here.
  8. from rest_framework.authentication import TokenAuthentication,BasicAuthentication,SessionAuthentication
  9.  
  10. from rest_framework_jwt.authentication import JSONWebTokenAuthentication
  11. class VerifyCodeListViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin, viewsets.GenericViewSet):
  12. """
  13. 验证码列表
  14. """
  15. queryset = VerifyCode.objects.all()
  16. serializer_class = VerifyCodeSerializer
  17. # authentication_classes = [TokenAuthentication, ]
  18. # authentication_classes = [JSONWebTokenAuthentication, ]
  19. # JWT 认证 加密,过期时间
  20. def get_authenticators(self):
  21. """
  22. Instantiates and returns the list of authenticators that this view can use.
  23. # 修改验证
  24. """
  25. # 动态认证
  26. print(self.authentication_classes)
  27. print([JSONWebTokenAuthentication, ])
  28. if self.action_map['get'] == "retrieve":
  29. self.authentication_classes = [BasicAuthentication,SessionAuthentication,]
  30. elif self.action_map['get'] == "list":
  31. self.authentication_classes = [JSONWebTokenAuthentication,]
  32. return [auth() for auth in self.authentication_classes]
  33.  
  34. # DRF 自带的认证 不过期,易发生xss攻击
  35. # def get_authenticators(self):
  36. # """
  37. # Instantiates and returns the list of authenticators that this view can use.
  38. # # 修改验证
  39. # """
  40. # print(self.authentication_classes)
  41. # print([JSONWebTokenAuthentication, ])
  42. # if self.action_map['get'] == "retrieve":
  43. # self.authentication_classes = [BasicAuthentication,SessionAuthentication,]
  44. # elif self.action_map['get'] == "list":
  45. # self.authentication_classes = [JSONWebTokenAuthentication,]
  46. # return [auth() for auth in self.authentication_classes]
  47.  
  48. def get_queryset(self):
  49.      # 取出认证信息
  50. print(self.request.auth)
  51. # print(self.action)
  52. return self.queryset
  53. # url
  54.  
  55. """untitled URL Configuration
  56.  
  57. The `urlpatterns` list routes URLs to views. For more information please see:
  58. https://docs.djangoproject.com/en/1.10/topics/http/urls/
  59. Examples:
  60. Function views
  61. 1. Add an import: from my_app import views
  62. 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
  63. Class-based views
  64. 1. Add an import: from other_app.views import Home
  65. 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
  66. Including another URLconf
  67. 1. Import the include() function: from django.conf.urls import url, include
  68. 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
  69. """
  70. from rest_framework.authtoken import views
  71. from rest_framework_jwt.views import obtain_jwt_token
  72.  
  73. from django.conf.urls import url, include
  74. from django.contrib import admin
  75. from rest_framework import routers
  76. from users.views import VerifyCodeListViewSet
  77.  
  78. router = routers.DefaultRouter()
  79. router.register(r'codes', VerifyCodeListViewSet, 'codes')
  80.  
  81. urlpatterns = [
  82. url(r'^admin/', admin.site.urls),
  83. url(r'^api-auth/', include('rest_framework.urls'))
  84.  
  85. ]
  86. urlpatterns += [
  87. # drf 自带的
  88. url(r'^api-token-auth/', views.obtain_auth_token),
  89. # jwt 认证
  90. url(r'^jwt_auth/', obtain_jwt_token),
  91. ]
  92. urlpatterns += router.urls

views.py

测试

1. debug模式启动

2. 使用postmain测试

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

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

调试结束后可以看到结果

Django JWT Token RestfulAPI用户认证的更多相关文章

  1. (30)auth模块(django自带的用户认证模块)

    Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的 ...

  2. Django之auth模块用户认证模块

    一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...

  3. Django自带的用户认证

    1. 创建超级用户   python manage.py createsuperuser   2. 认证  校验用户名和密码  obj = auth.authenticate(request,user ...

  4. Django框架 之 Auth用户认证

    Django框架 之 Auth用户认证 浏览目录 auth模块 user对象 一.auth模块 1 from django.contrib import auth django.contrib.aut ...

  5. 5分钟搞懂:基于token的用户认证

    https://www.qikegu.com/easy-understanding/880 用户认证 用户认证或者说用户登录是确认某人确实是某人的过程,生活中靠身份证,网络上就要靠账号和密码.用户提供 ...

  6. 6月29日学习总结 Django自带的用户认证

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的要设计.实现网站的用户系统.此时我们需要实现包括但不限于用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. D ...

  7. 基于JWT标准的用户认证接口实现

    前面的话 实现用户登录认证的方式常见的有两种:一种是基于 cookie 的认证,另外一种是基于 token 的认证 .本文以基于cookie的认证为参照,详细介绍JWT标准,并实现基于该标签的用户认证 ...

  8. JWT token 跨域认证

    JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案. session登录认证方案:用户从客户端传递用户名.密码等信息,服务端认证后将信息存储在session中,将sessio ...

  9. Django内置的用户认证

    认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码. ...

随机推荐

  1. 洛谷P3627[APOI2009] (讨厌的)抢掠计划

    题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...

  2. Python3 Tcp未发送/接收完数据即被RST处理办法

    一.背景说明 昨天一个同事让帮忙写个服务,用于接收并返回他那边提交过来的数据,以便其查看提交的数据及格式是否正确. 开始想用django写个接口,但写接口接口名称就得是定死的,他那边只能向这接口提交数 ...

  3. JVM常用配置参数说明

    堆设置 -Xms256M:初始堆大小256M,默认为物理内存的1/64 -Xmx1024M:最大堆大小1024M,默认为物理内存的1/4,等于与-XX:MaxHeapSize=64M -Xmn64M: ...

  4. css属性应用bug大杂烩(后续继续更新)

    一.Flex布局使用时的坑: 1.常见的左右分布的flex布局中,左侧给定宽度,右侧占满剩余空间,但当右侧中文字内容很多时,会挤占左侧空间,时左侧不能按照定宽显示. <style> .fa ...

  5. k8s 部署rabbitmq单节点

    apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: fabric8.io/iconUrl: https://r ...

  6. day47-python爬虫学习二

    2.Request的会话对象 s = requests.session() Python2 S = requests.Session() 所有一次会话的信息都保存在s中,只需要对s进行操作就可以了. ...

  7. 如何下载最新Xshell版本、免费官方正版软件的技巧过程

    我们在操作和管理Linux VPS.服务器的时候,肯定需要使用SSH工具,对于这个工具网上有很多免费和付费版本.对于我们用户来说肯定会较多的选择免费软件.其中使用较多的还是Xshell工具,也是我认为 ...

  8. 列举至少3种Support包中提供的布局或工具

    android.support.v7.widget.CardView 继承自FrameLayout并实现了圆角和阴影效果,常用于ListView或RecyclerView中Item布局的根节点 示例代 ...

  9. Collections集合工具类

    一.Collection与Collections Collection 是所有单列集合的根接口 Collection 是操作集合的工具类 二.Collections中常见的方法:(大都是static方 ...

  10. 磁盘挂载方法 fdisk parted

    1创建磁盘分区 [root@web01 ~]# fdisk -cu /dev/sdc -c 关闭dos兼容模式-u 使用扇区进行分区 (默认位柱面)[root@web01 ~]# partprobe ...