(生鲜项目)16. 前后端分离之JWT认证
第一节: 基本介绍
1. 什么是JWT
扫盲转载: https://www.jianshu.com/p/d04c2abab5d0
第二节: REST框架中JWT的使用
1. 环境配置, JWT官网: https://jpadilla.github.io/django-rest-framework-jwt/
在VueShop的虚拟环境下安装包
pip install djangorestframework-jwt
settings.py
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ # JWT用的用户认证 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ] }
urls.py
from rest_framework_jwt.views import obtain_jwt_token #... urlpatterns = [ '', # ... url(r'^jwt_auth/', obtain_jwt_token), ]
2. 浏览器测试jwt接口是否正常
3. 携带JWT的token 去访问goods接口, 看服务端能否识别出是哪个用户
第三节: 将JWT与Vue结合起来
1. 查看前端Vue的接口是什么, Vue中是login, 所以我们要把后台的接口也改成login, (注意这里Vue中应该是localhost, 截图时忘了改)
before url(r'^jwt_auth/', obtain_jwt_token), after url(r'^login/', obtain_jwt_token),
输入账号密码, 登录成功
2. Vue登录源码分析
第四节: 将手机号设置成登录账号
1. 为了完成后面的手机号码注册登录功能, 这里我们先把手机号设置成可登录的账号
user.views.py
from django.shortcuts import render 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() # 自定义用户验证, 让手机号码也可以登录 class CustomBackend(ModelBackend): def authenticate(self, username=None, password=None, **kwargs): try: user = User.objects.get(Q(username=username) | Q(mobile=username)) if user.check_password(password): return user except Exception as e: return None
settings.py
AUTHENTICATION_BACKENDS = ( "users.views.CustomBackend", )
2. 断点测试, 看自定义的类有没有起作用
第五节: JWT的设置
1. 其实JWT自带很多设置
settings.py
import datetime
JWT_AUTH = { 'JWT_ENCODE_HANDLER': 'rest_framework_jwt.utils.jwt_encode_handler', 'JWT_DECODE_HANDLER': 'rest_framework_jwt.utils.jwt_decode_handler', 'JWT_PAYLOAD_HANDLER': 'rest_framework_jwt.utils.jwt_payload_handler', 'JWT_PAYLOAD_GET_USER_ID_HANDLER': 'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler', 'JWT_RESPONSE_PAYLOAD_HANDLER': 'rest_framework_jwt.utils.jwt_response_payload_handler', 'JWT_SECRET_KEY': settings.SECRET_KEY, 'JWT_GET_USER_SECRET_KEY': None, 'JWT_PUBLIC_KEY': None, 'JWT_PRIVATE_KEY': None, 'JWT_ALGORITHM': 'HS256', 'JWT_VERIFY': True, 'JWT_VERIFY_EXPIRATION': True, 'JWT_LEEWAY': 0, 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), 'JWT_AUDIENCE': None, 'JWT_ISSUER': None, 'JWT_ALLOW_REFRESH': False, 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_AUTH_HEADER_PREFIX': 'JWT', 'JWT_AUTH_COOKIE': None, }
2. 我们当前需要的配置如下
settings.py
# JWT的额外设置 import datetime JWT_AUTH = { # 过期时间 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), # "头 密钥"中的头的设置 'JWT_AUTH_HEADER_PREFIX': 'JWT', }
--- 君子处其实,不处其华;治其内,不治其外 张居正 ----