Django中已经封装好了后端的认证功能authenticate
1:Django REST framework JWT提供了登录签发JWT的视图,可以直接使用
验证用户名和密码,验证成功后,为用户签发JWT,前端将签发的JWT保存下来。
登录流程为:
查询用户数据,将查询到的数据和用户输入的数据对比验证
request.user===>当前登录的用户
仅使用下面的代码即可实现登录和签发token
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^authorizations/$', obtain_jwt_token),
]
但是此视图函数所返回的只有一个token值,当需要获取到其他值,如user.id,username等值时,需要重写jwt_response_payload_handler函数
2:新建一个py文件重写自定义返回值的函数
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定义jwt认证成功返回数据
"""
return {
'token': token,
'user_id': user.id,
'username': user.username
}
然后修改项目的配置文件
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
便可实现登录功能,此时可以返回给客户端token值和id,显示用户名信息
3:实现使用不同的注册信息进行登录,如使用手机号、邮箱 + 密码登录。
主要的逻辑是接收到用户输入的登录信息,使用正则表达式来判断用户是使用的那种注册信息登录的,然后根据注册信息查找到用户对象,返回用户信息,实现多种号码都可登录的功能
查看jwt视图的源代码发现,查询验证的工作是由authenticate()方法完成,这个方法是由django提供的。
修改Django认证系统的认证后端需要继承django.contrib.auth.backends.ModelBackend,并重写authenticate方法。
authenticate(self, request, username=None, password=None, **kwargs)方法的参数说明:
- request 本次认证的请求对象
- username 本次认证提供的用户账号
- password 本次认证提供的密码
重写authenticate方法,补充它的验证功能,使其不仅仅可以使用用户名登录
from django.contrib.auth.backends import ModelBackend
class MyAuthenticationBackends(ModelBackend):
"""根据username查找 user对象, 在使用user对象的check_password对比密码是否正确"""
def authenticate(self, request, username=None, password=None, **kwargs):
if re.match(r'^1[3-9]\d{9}$', username):
user = User.objects.get(mobile=username)
else:
user = User.objects.get(username=username)
if user.check_password(password):
return user
else:
return None
再在配置文件中告知django我们自定义的认证
AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]
总结思路:
1.定义类
2.重写authenticate方法
3.配置AUTHENTICATION_BACKENDS=[类]