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', ]
作者:枪林弹雨丶
若标题中有【转载】字样,则本文版权归原作者所有。若无转载字样,
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,
且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
请注意:作者五行缺钱,如果喜欢这篇文章,请随意打赏!

