rest_framework---JWT

drf使用JWT

  • 安装包

    pip install djangorestframework-jwt
    

JWT默认的认证

  • 在你的settings.py,添加JSONWebTokenAuthentication到Django REST框架DEFAULT_AUTHENTICATION_CLASSES

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
         	# jsonwebtoken
          	# 将用户post过来的token作为一个验证, 验证完成之后, 将他的user取出来
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
            'rest_framework.authentication.SessionAuthentication',
            'rest_framework.authentication.BasicAuthentication',
        ),
    }
    
  • 在您urls.py添加以下URL路由以启用通过POST获取令牌包括用户的用户名和密码。

    from rest_framework_jwt.views import obtain_jwt_token
    
    urlpatterns = [
        url(r'^api-token-auth/', obtain_jwt_token),
    ]
    
  • 可以直接获取身份验证令牌

    rest_framework---JWT_第1张图片

  • 为了访问受保护的API,您必须包含Authorization: JWT 标题。
    rest_framework---JWT_第2张图片

自定义认证类–上面JWT默认的认证还是需要

  • users下的views下定义
    # ModelBackend用户认证类
    from django.contrib.auth.backends import ModelBackend
    from django.contrib.auth import get_user_model
    from django.db.models import Q
    
    # 获取用户模型类
    UserProfile = get_user_model()
    
    
    class CustomBackend(ModelBackend):
        """
        自定义用户验证
        """
        # 他是被django来调用的
        # username就是你登入的用户名
        # password就是你登入的密码
        def authenticate(self, request, username=None, password=None, **kwargs):
            try:
                # 获取用户对象
                user = UserProfile.objects.get(Q(username=username) | Q(mobile=username))
                # check_password(password)对密码进行加密, 比对两者密码是否相同
                if user.check_password(password):
                    return user
            except Exception as e:
                return None
    
    
  • setting配置
    # 指定验证类
    AUTHENTICATION_BACKENDS = (
        'users.views.CustomBackend',
    )
    
    rest_framework---JWT_第3张图片
  • ModelBackend源码
    rest_framework---JWT_第4张图片

JWT的相关配置选项

  • 您可以覆盖一些其他设置,类似于您使用Django REST框架本身的方式。以下是所有可用的默认值。

    JWT_AUTH = {
        'JWT_ENCODE_HANDLER':
        'rest_framework_jwt.utils.jwt_encode_handler',
    
        'JWT_DECODE_HANDLER':
        'rest_framework_jwt.utils.jwt_decode_handler',
    
        'JWT_PAYLOAD_HANDLER':
        'rest_framework_jwt.utils.jwt_payload_handler',
    
        'JWT_PAYLOAD_GET_USER_ID_HANDLER':
        'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
    
        'JWT_RESPONSE_PAYLOAD_HANDLER':
        'rest_framework_jwt.utils.jwt_response_payload_handler',
    
        'JWT_SECRET_KEY': settings.SECRET_KEY,
        'JWT_GET_USER_SECRET_KEY': None,
        'JWT_PUBLIC_KEY': None,
        'JWT_PRIVATE_KEY': None,
        'JWT_ALGORITHM': 'HS256',
        'JWT_VERIFY': True,
        'JWT_VERIFY_EXPIRATION': True,
        'JWT_LEEWAY': 0,
        # 过期时间300秒
        'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
        'JWT_AUDIENCE': None,
        'JWT_ISSUER': None,
    
        'JWT_ALLOW_REFRESH': False,
        'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
    	# 设置添加headers时Authorization的值以什么开头 列:(Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InB5dGhvbiIsImV4cCI6MTU2ODcyMDIyMSwiZW1haWwiOiJweXRob25AMTYzLmNvbSJ9.C7gh-W2na9mI2wDB-2MjIXFe467ceZvtdPBpPr90rf0)
        'JWT_AUTH_HEADER_PREFIX': 'JWT',
        'JWT_AUTH_COOKIE': None,
    
    }
    

    这个包使用JSON Web Token Python实现PyJWT,并允许修改它的一些可用选项。

  • 直接在setting设置
    rest_framework---JWT_第5张图片

你可能感兴趣的:(rest_framework)