Django-rest-framework-JWT之(JWT原理解析及配置和错误解决)

文章目录

      • 1.测试工具
      • 2.JWT原理介绍
      • 3.Django-rest-framework-JWT安装配置及其错误处理
      • 4.测试

1.测试工具

使用的Web接口测试工具:Postman

2.JWT原理介绍

  • JWT的介绍以及对比,参考文章:参考文章1,参考文章2
  • JWT配置后就不会生成Token表了,原因参考上述文章

3.Django-rest-framework-JWT安装配置及其错误处理

  • 使用:在github搜索django-rest-framework-jwt 或:点击跳转
    进入后点击跳转:进入官方文档(查看依赖和具体配置)
    在这里插入图片描述
  • 具体配置如下

安装参考上述官方文档:
配置如下:
(1)在你的settings.py,添加JSONWebTokenAuthentication到Django REST框架DEFAULT_AUTHENTICATION_CLASSES。



REST_FRAMEWORK = {
      'DEFAULT_PERMISSION_CLASSES': (
     				'rest_framework.permissions.IsAuthenticated',
                        ),
     'DEFAULT_AUTHENTICATION_CLASSES':(
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
      'rest_framework.authentication.SessionAuthentication',
      'rest_framework.authentication.BasicAuthentication',
                ),
            }

(2)在urls.py添加以下URL路由以启用通过POST获取令牌包括用户的用户名和密码。

from rest_framework_jwt.views import obtain_jwt_token
          
urlpatterns = [
          
         url(r'^login/', obtain_jwt_token),
            ]

(3)jwt相关使用(setting.py中配置):

import datetime
JWT_AUTH={
    #Token失效时间
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    #Token前缀
    'JWT_AUTH_HEADER_PREFIX': 'JWT'
}

(4)自定义用户验证(obtain_jwt_token默认为使用用户名和密码):

#setting中添加BANCENDS
AUTHENTICATION_BACKENDS=(
  #将bancends添加进setting
  'users.views.CustomBackend',
 
)

切记:此处自定义的视图函数继承ModelBackend类,并重写其内部函数authenticate。
若是使用正确的用户名和密码登录报错:

Django-rest-framework-JWT之(JWT原理解析及配置和错误解决)_第1张图片
点击继承的类,查看重写的函数,是由于该函数缺少 request 参数引发的

#users.views中重写authenticate认证

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
User=get_user_model()

# Create your views here.
class CustomBackend(ModelBackend):
   '''
   自定义用户验证(setting.py)
   '''
   def authenticate(self, request, username=None, password=None, **kwargs):
       try:
           user=UserProfile.objects.get(Q(username=username)|Q(mobile=username))
           if user.check_password(password):
             return user
       except Exception as e:
           return None

4.测试

  • 模拟首次访问(登陆)
    Django-rest-framework-JWT之(JWT原理解析及配置和错误解决)_第2张图片
  • 登陆后请求数据(模拟携带token请求数据,放在HTTP Headers中)
    Django-rest-framework-JWT之(JWT原理解析及配置和错误解决)_第3张图片

你可能感兴趣的:(Python+Django开发)