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 UserByUsernameMobile(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',
]

猜你喜欢

转载自www.cnblogs.com/Python-XiaCaiP/p/10210440.html
今日推荐