添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
import




    
 datetime
from django.conf import settings
from rest_framework.settings import APISettings
USER_SETTINGS = getattr(settings, 'JWT_AUTH', None)
DEFAULTS = {
    '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_PRIVATE_KEY':None,
    'JWT_PUBLIC_KEY':None,
    'JWT_PAYLOAD_GET_USERNAME_HANDLER':
    'rest_framework_jwt.utils.jwt_get_username_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_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=21),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,
    'JWT_ALLOW_REFRESH': False,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=21),
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    'JWT_AUTH_COOKIE': None,
api_settings = APISettings(USER_SETTINGS, DEFAULTS)
import jwt
from .api_settings import api_settings
def jwt_decode_handler(token):
    options = {
        'verify_exp': api_settings.JWT_VERIFY_EXPIRATION,
    return jwt.decode(
        token,
        api_settings.JWT_PUBLIC_KEY or api_settings.JWT_SECRET_KEY,
        api_settings.JWT_VERIFY,
        options=options,
        leeway=api_settings.JWT_LEEWAY,
        audience=api_settings.JWT_AUDIENCE,
        issuer=api_settings.JWT_ISSUER,
        algorithms=[api_settings.JWT_ALGORITHM]
def jwt_get_user_id_from_payload_handler(payload):
    return payload.get('id')

2、在中间件中处理冻结的逻辑

from django.http import JsonResponse
# 就是上面定义的方法
from comment.utils.utils import jwt_get_user_id_from_payload_handler, jwt_decode_handler
from users.models import User
import jwt
class PermissionMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.META.get('HTTP_AUTHORIZATION'):
            token = (request.META.get('HTTP_AUTHORIZATION').split(' '))[1]
            try:
                payload = jwt_decode_handler(token)
                user_id =  jwt_get_user_id_from_payload_handler(payload)
                if not user_id:
                    return JsonResponse({"message": "用户不存在!" , "errorCode": 5, "data": {}})
                now_user = User.objects.values('id', 'is_freeze').filter(id=user_id).first()
                if not now_user:
                    return JsonResponse({"message": "用户不存在!" , "errorCode": 5, "data": {}})
                if now_user.get('is_freeze'):
                    return JsonResponse({"message": "账户被冻结!", "errorCode": 6, "data": {}})
            except jwt.ExpiredSignature:
                return JsonResponse({"message": 'Token过期' , "errorCode": 5, "data": {}})
            except jwt.DecodeError:
                return JsonResponse({"message": 'Token不合法' , "errorCode": 5, "data": {}})
            except jwt.InvalidTokenError as e:
                return JsonResponse({"message": "出现了无法预料的view视图错误:%s" % e, "errorCode": 1, "data": {}})

3、在settings.py中激活中间件

...
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 跨域中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'debug_toolbar.middleware.DebugToolbarMiddleware',  # debug tool
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'comment.middleware.WechatAppMiddleware',
    'comment.middleware.LogMiddleware',
    'comment.middleware.JsondataMiddleware',
    'comment.middleware.PermissionMiddleware', # 刚才定义的中间件 在最后面的位置激活
...

4、相关此时截图

正常的
在这里插入图片描述
不带token的
在这里插入图片描述
携带错误token的
在这里插入图片描述
携带正常token,但是被冻结的
在这里插入图片描述

1、jwt相关方法将得到的token转为payload再将payload转为user iddef jwt_encode_handler(payload): return jwt.encode( payload, api_settings.JWT_PRIVATE_KEY or api_settings.JWT_SECRET_KEY, ap...
用户功能核心的能力就是注册,登录之后就可以管理博客了,先把这两个实现了,再实现和博客相关的功能。用户注册开始就使用了restful风格的设计,restful风格是一个理论上的东西,但是有一个实践,要定义每一个请求用了什么样的方法,大多数提交数据都用了post,提交到哪里,就需要告诉ur,还需要告诉之间用了什么数据,比如提交的数据是json的 json的样子是什么都需要告诉 这里使用多级的方式 JWT的工作原理? 我们带着4个问题进入学习1.什么是JWTJWT全称Json Web Token,JWT 是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明。目前,JWT广泛应用在系统的用户认证方面,特别是现在前后端分离项目。2.为什么要使用JWT?它有什么优势? 用户登录认证方式分为传统的token登录方式和
首次使用需要安装django-rest-framework及jwt相关包 pip install djangorestframework pip install djangorestframework-simplejwt 2.settings文件增加配置 INSTALLED_APPS = [ 'rest_framework', 'rest_framework_simplejwt' REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS'
axios拦截器是什么?   axios拦截器可以拦截每一次的请求和响应,然后进行相应的处理。拦截器分为请求拦截器和响应拦截器,请求拦截器可以统一在你发送请求前在请求体里加上token;响应拦截器的话,是在接受到响应之后进行的一些操作,比如,服务器返回登录状态失效,需要重新登录的时候,就给它跳到登录页面; 拦截器的使用 我一般喜欢全局配置(main.js) 请求拦截器 // interceptors axios.interceptors.request.use( config => { 因http协议本身为无状态,这样每次用户发出请求,我们并不能区分是哪个用户发出的请求,这样我们可以通过保存cookie以便于识别是哪个用户发来的请求,传统凡事基于session认证。但是这种认证本身很多缺陷,扩展性差,CSRF等问题。JWT(Json web token) 相比传统token,设计更为紧凑且安全。通过JWT可以实现用户认证等操作。 pyJWT下载 pip install pyJWT JWT构成: eyJ0eXAiOiJKV1QiLC
# 身份认证 ‘DEFAULT_AUTHENTICATION_CLASSES’: ( ‘rest_framework_jwt.authentication.JSONWebTokenAuthentication’, ‘rest_framew 服务器里面存储一个加密算法的 密匙, 然后有用户登陆时, 通过用户提供的信息, 用这个 密匙 生成一个 token 返回给 前端,前端把这个 token 保存到本地,然后下次请求 数据时带上这个 token ,后端获取到...
文章目录聊聊JWT1、JWT简介2、JWT 组成3、JWT 的使用方式4、JWT 的几个特点DRF中使用JWT1. 安装2. 使用 聊聊JWT 1、JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。它具备两个特点: 简洁(Compact) 可以通过URL, POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快 自包含(S
Django中间件可以用来验证JWT Token。JWT Token是一种用于身份验证的令牌,它由三部分组成:头部、载荷和签名。在Django中,可以使用第三方库django-rest-framework-jwt来实现JWT Token的验证。该库提供了一个名为JWTAuthentication的中间件,可以用来验证请求头中的Authorization字段中的Token是否有效。如果Token有效,则将用户信息添加到请求对象中,以便后续的视图函数可以使用。如果Token无效,则返回401 Unauthorized响应。使用该中间件需要在Django的settings.py文件中进行配置。