• drf—— JWT认证及基本使用


    一、JWT认证介绍

    1 不再使用Session认证机制,而使用Json Web Token(本质就是token)认证机制,用户登录认证
    2 用户只要登录了,返回用户一个token串(随机字符串),每次用户发请求,需要携带这个串过来,验证通过,我们认为用户登录了
    3 JWT的构成(字符串)
        -三部分(每一部分中间通过.分割):header   payload  signature
        -header:声明类型,这里是jwt,声明加密算法,头里加入公司信息...,用base64转码
            {
              'typ': 'JWT',
              'alg': 'HS256' #用md5也行
            }
        -payload:荷载(有用),当前用户的信息(用户名,id,这个token的过期时间,手机号),用base64转码
            {
              "sub": "1234567898",
              "name": "egon",
              "admin": true,
              "userid":1,
              'mobile':123444444
            }
        -signature:签名
            -把前面两部分的内容通过加密算法+密钥加密后得到的一个字符串
            
            
        -jwt总的构成样子:
          eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
            
    4 JWT认证原理
        -用户携带用户名,密码登录我的系统,校验通过,生成一个token(三部分),返回给用户---》登录功能完成
        -访问需要登录的接口(用户中心),必须携带token过来,后端拿到token后,把header和payload截出来,再通过一样的加密方式和密码得到一个signature,
        和该token的signature比较,如果一样,表示是正常的token,就可以继续往后访问

    二、jwt基本使用(使用内置jwt

    安装

    1 drf中使用jwt,借助第三方https://github.com/jpadilla/django-rest-framework-jwt
    2 安装 pip3 install djangorestframework-jwt

    快速使用

    3 快速使用(默认使用auth的user表)
        (1) 在默认auth的user表中创建一个用户
        (2) 在路由中配置
        from rest_framework_jwt.views import obtain_jwt_token
            path('login/', obtain_jwt_token),
        (3) 用postman向这个地址发送post请求,携带用户名,密码,登陆成功就会返回token
        
        (4)obtain_jwt_token本质也是一个视图类,继承了APIView
            -通过前端传入的用户名密码,校验用户,如果校验通过,生成token,返回
            -如果校验失败,返回错误信息
        访问地址:http://127.0.0.1:8000/homework/login/

    用户登录以后才能访问某个接口

    4 用户登录以后才能访问某个接口
        -jwt模块内置了认证类,拿过来局部配置就可以
        -class OrderView(APIView):
            # 只配它不行,不管是否登录,都能范围,需要搭配一个内置权限类
            authentication_classes = [JSONWebTokenAuthentication, ]
            permission_classes = [IsAuthenticated,]
            def get(self, request):
                print(request.user.username)
                return Response('订单的数据')
       访问地址: http://127.0.0.1:8000/homework/order/  
    注意:访问的时候需要在header内携带jwt

    用户未登录,可以访问

    5 用户未登录,可以访问
        -class OrderView(APIView):
            # 只配它不行,不管是否登录,都能范围,需要搭配一个内置权限类
            authentication_classes = [JSONWebTokenAuthentication, ]
            def get(self, request):
                print(request.user.username)
                return Response('订单的数据')
       访问地址: http://127.0.0.1:8000/homework/order/

    注意事项

    6 如果用户携带了token,并且配置了JSONWebTokenAuthentication,从request.user就能拿到当前登录用户,如果没有携带,当前登录用户就是匿名用户
    
    7 前端要发送请求,携带jwt,格式必须如下
        -把token放到请求头header中,key为:Authorization 
        -value必须为:jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo1LCJ1c2VybmFtZSI6ImVnb24xIiwiZXhwIjoxNjA1MjQxMDQzLCJlbWFpbCI6IiJ9.7Y3PQM0imuSBc8CUe_h-Oj-2stdyzXb_U-TEw-F82WE

    三、控制登录接口返回的数据格式

    1 控制登录接口返回的数据格式如下
        {
        code:100
        msg:登录成功
        token:asdfasfd
        username:egon
        }
        
    2 写一个函数utils.py
        from homework.serializer import UserReadOnlyModelSerializer
        def jwt_response_payload_handler(token, user=None, request=None):
            return {'code': 100, 
                    'msg': '登录成功',
                    'token': token,
                    'user': UserReadOnlyModelSerializer(instance=user).data
                    }
    3 在setting.py中配置
        import datetime
        JWT_AUTH = {
            'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
        }

    四、自定义基于jwt的认证类

    1 自己实现基于jwt的认证类,通过认证,才能继续访问,通不过认证就返回错误
    2 自己写个类auth.py class JwtAuthentication(BaseJSONWebTokenAuthentication): def authenticate(self, request): # 认证逻辑() # token信息可以放在请求头中,请求地址中 # key值可以随意叫 # token=request.GET.get('token') token=request.META.get('HTTP_Authorization'.upper()) # 校验token是否合法 try: 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 在视图类中配置 authentication_classes = [JwtAuthentication, ] # 视图views.py全代码: from app01.auth import JwtAuthentication   class OrderView(APIView): # 登录以后才能访问   authentication_classes = [JwtAuthentication, ]   def get(self, request):   print(request.user.username)    return Response('订单的数据')
  • 相关阅读:
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS博客作业02--线性表
    c博客06-结构体&文件
    C博客作业05--2019-指针
    面向对象设计大作业——QQ联系人系统
    DS博客作业05--查找
    DS博客作业04--图
  • 原文地址:https://www.cnblogs.com/guojieying/p/13966264.html
Copyright © 2020-2023  润新知