基于jwt的多方式登录,自定义user表,签发token,认证类,book表单增删查改,群增删查改

本文档详细介绍了如何使用JWT进行多方式登录的实现,包括路由设置、模型定义、配置修改、视图函数、序列化类以及辅助工具函数。同时,讲解了自定义用户表、签发令牌和认证类的创建。此外,还涵盖了book表与其他表的关系建立,以及book表的增删查改群操作和对应的序列化类与路由设计。
摘要由CSDN通过智能技术生成

一.上节回顾

1 jwt:重点(跟语言,框架无关)
	-json web token
	-cookie:客户端浏览器上的键值对,数据不安全
	-session:服务端的键值对(内存,数据库,redis,文件),安全,对服务端压力大
	-token:三段:.荷载.签名
		-header(公司信息,加密方式...)
		-payload(荷载,真正有用的数据部分,用户id,用户名字...)
		-signature(签名,把头和荷载部分通过加密算法加密--->得到一个签名)
2 drf-jwt模块
	-快速使用:(默认使用的是auth的user表)
		-1创建用户
		-2在路由中配置path('login/',obtain_jwt_token),
		-3在postman中测试,用户名密码输入刚刚创建的用户就可以生成token
		-4让一个视图必须登录以后才能访问
			-authentication_classes = [JSONWebTokenAuthentication, ]
			-permission_classes = [IsAuthenticated,]
		-5让一个视图可以登录后访问,也可以不登录访问
			-authentication_classes = [JSONWebTokenAuthentication, ]
		-6 用postman测试,在请求头中加入
			-Authorization  jwt adfasdf
	-自己写基于jwt的认证类(登录了能访问,不登录就不能访问)
	class JwtAuthentication(BaseJSONWebTokenAuthentication):
	def authenticate(self, request):
                #token=request.GET.get('token')
                token=request.META.get('HTTP_Authorization'.upper())
                try:
                    # 验证token是否正确
                    payload = jwt_decode_handler(token)
                except jwt.ExpiredSignature:
                    raise AuthenticationFailed('过期了')
                except jwt.DecodeError:
                    raise AuthenticationFailed('解码错误')
                except jwt.InvalidTokenError:
                    raise AuthenticationFailed('不合法的token')
                user=self.authenticate_credentials(payload)
                return (user, token)
	-自定制认证类的使用方式:
		-全局使用
		-局部使用
3 base64编码(跟语言无关,跟框架无关)
	-不同语言的base64可以相互编码解码
	-base64内置模块
	-图片的二进制,有的时候也会以base64的形式编码
4 drf的视图(两个,5,9,视图集)+序列化器+自动生成路由

二.今日内容

1.基于jwt的多方式登录

1 手机号+密码 用户名+密码 邮箱+密码
2 流程分析(post请求):
	-路由:自动生成
	-视图类:ViewSet(ViewSetMixin,views.APIView)
	-序列化类:重写validate方法,在这里面对用户名和密码进行校验
3 代码实现

路由

path('login/', views.LoginViewSet.as_view({
   'post':'create'})),

或者:
from rest_framework.routers import SimpleRouter
from app01.views import LoginViewSet
router=SimpleRouter()
router.register('login',LoginViewSet,basename='login')

urlpatterns = [
	path('admin/',admin.site.urls),

]
urlpatterns+=router.urls

models.py

from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    phone = models.CharField(max_length=32, unique=True)

settings.py

AUTH_USER_MODEL = 'app01.UserInfo'



REST_FRAMEWORK = {
   
    # 配置全局异常
    'EXCEPTION_HANDLER': 'app01.utils.common_exception'
}

视图

from rest_framework.viewsets import ViewSet
from app01.serializer import LoginSerializer
from app01.utils import APIResponse

class LoginViewSet(ViewSet):
    def create(self, request, *args, **kwargs):
        # 实例化得到一个序列化类的对象
        # ser=LoginSerializer(data=request.data,context={'request':request})
        ser = LoginSerializer(data=request.data)
        # 序列化类的对象的校验方法
        ser.is_valid(raise_exception=True)  # 字段自己的校验,局部钩子校验,全局钩子校验
        # 如果通过,表示登录成功,返回手动签发的token
        token = ser.context.get('token')
        username = ser.context.get('username
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值