zoukankan      html  css  js  c++  java
  • Django-rest_framework中利用jwt登录验证时,自定义返回凭证和登录校验支持手机号

    安装

    pip install djangorestframework-jwt

    在Django.settings中配置

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',  # 添加jwt验证类
         
        ),
    }
     
    JWT_AUTH = {
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  # 生成的token有效期
    }

    调用jwt登录验证视图

    在对应的Django应用的urls中添加如下路径

    from rest_framework_jwt.views import obtain_jwt_token
     
     
    urlpatterns = [
        url(r'^authorizations/$', obtain_jwt_token),  # 路径可以按照自己需求指定
    ]

    由于jwt返回的信息中只包括凭证token,要想在返回的结果中添加用户信息,需要通过如下配置

    def jwt_response_payload_handler(token,user=None,request=None):
        """为返回的结果添加用户相关信息"""
        
        return {
                 'token':token,
                 'user_id':user.id,
                 'username':user.username
                }

    同时在settings中添加配置

    JWT_AUTH = {
        'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),  # token有效期
        'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',  # response中token的payload部分处理函数
    }

    由于jwt的登录验证默认只支持使用username,为了能够使用手机号验证,可通过重写Django验证类django.contrib.auth.backends.ModelBackend中的authenticate方法:

          authenticate(self, request, username=None, password=None, **kwargs) ;

    参数说明

    request:发起本次认证请求的对象

    username:发起本次认证请求的用户名

    password:发起本次认证请求的密码

    def get_user_by_account(account):
        """
        添加通过手机号查询用户的方法
        """
        try:
            if re.match(r'^1[3,5,6,7,8,9]d{9}$',account):  # account 是手机号
                user = User.objects.get(mobile=account)
            else:
                user = User.objects.get(username=account)
        except User.DoesNotExist:
            return None
        else:
            return user
     
     
     
    class UsernameMobileAuthBackend(ModelBackend):
        """添加支持手机号登录"""
        def authenticate(self,request,username=None,password=None,**kwargs):
            user = get_user_by_account(username)  # username 可能是用户名也可能是手机号
            return user

    在Django配置中添加认证配置

    AUTHENTICATION_BACKENDS = [
        'users.utils.UsernameMobileAuthBackend',
    ]
  • 相关阅读:
    378. Kth Smallest Element in a Sorted Matrix
    387. First Unique Character in a String
    230. Kth Smallest Element in a BST
    384. Shuffle an Array(随机排序)
    454. 4Sum II
    627. Swap Salary
    166. Fraction to Recurring Decimal
    763. Partition Labels(贪心)
    496. Next Greater Element I
    766. Toeplitz Matrix
  • 原文地址:https://www.cnblogs.com/Python-XiaCaiP/p/10210440.html
Copyright © 2011-2022 走看看