重写django自带的用户认证
前文,查看官方文档:https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index.html
token应用流程:
- 初次登录:用户初次登录,输入用户名密码
- 密码验证:服务器从数据库取出用户名和密码进行验证
- 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT
- 返还JWT:服务器的HTTP RESPONSE中将JWT返还
- 带JWT的请求:以后客户端发起请求,HTTP REQUEST HEADER中的Authorizatio字段都要有值,为JWT,注意JWT后带一个空格
内置的认证登陆
在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;
如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。
事实上,Django已经提供了内置的用户认证功能。
为何要自己写认证
有时候我们需要用到邮箱或者手机登录而不只是用户名,所以需要自己重写功能,在utils文件夹里创建一个文件authenticate.py里面写:
# 在当前文件里面,定义的是自定义的认证系统
from django.contrib.auth.backends import ModelBackend
import re
from users.models import Users
import logging
# 这是日志
log = logging.getLogger('users')
class UserPhoneEmailAuthBackend(ModelBackend):
# 当前的类是用来做自定义的认证用户
def authenticate(self, request, username=None, password=None, **kwargs):
'''重写父类的方法
:param request: 请求
:param username: 可能是手机或者email
:param password: 密码
:param kwargs: 其他参数,键值形式
:return: user模型对象
'''
# 1.不论是用户名还是手机还是邮箱先获取到user对象
try:
if re.match(r'^1[3456789][\d]{9}$', username):
user = Users.objects.get(phone=username)
elif re.match(r'^[\w_]{3,15}@[\w]{2,11}.com$', username):
user = Users.objects.get(email=username)
else:
user = Users.objects.get(username=username)
except Users.DoseNotExist:
user = None
log.error('auth验证失败 ', username)
# 拿到user后进行校验
if user is not None and user.check_password(password):
return user
如何使用的jwt自带的验证视图
直接在对应的urls.py里配置即可
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
# 登录验证
url(r'^login/$', obtain_jwt_token),]
在前端登录ajax请求
通过ajax请求发送用户名和密码。验证成功后会得到token。
然后把token存到localStorage,这个是固定存储网页关闭了也存在,在设置.py里可以设置过期时间。
$('#login').click(function () {
// 用户名,密码
var username = $('#username').val();
var userpwd = $(