JSON Web Token令牌(JWT)的使用(二)重写自带的用户认证和token流程

本文介绍如何在Django中使用JSON Web Token (JWT)进行用户认证,包括为何重写内置认证,如何使用JWT自带的验证视图,前端如何通过ajax请求发送JWT,以及如何在后端重写JWT返回内容以获取更多用户信息。
摘要由CSDN通过智能技术生成

前文,查看官方文档: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 = $(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值