(生鲜项目)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',
}

 

 

 

 

 

 

 

---  君子处其实,不处其华;治其内,不治其外   张居正  ----

posted @ 2019-12-27 16:09  渱尘  阅读(287)  评论(0编辑  收藏  举报