首页 > 其他分享 >JWT 登录与注销示例

JWT 登录与注销示例

时间:2024-11-15 16:57:10浏览次数:1  
标签:axios 示例 JWT refresh access token rest error 注销

1. 后端(Django + DRF)实现

安装依赖

首先,确保安装了 django-rest-frameworkdjango-rest-framework-simplejwt

pip install djangorestframework
pip install djangorestframework-simplejwt

配置 settings.py

# settings.py

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt.token_blacklist',  # 启用黑名单
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    ...
}

SIMPLE_JWT = {
    'AUTH_HEADER_TYPES': ('Bearer',),
}

创建视图(登录、注销)

# views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework import status

# 登录视图:获取 access 和 refresh token
class LoginView(APIView):
    def post(self, request):
        # 假设已经进行了用户名和密码的认证(这里只是示例,实际应用应使用用户验证逻辑)
        username = request.data.get('username')
        password = request.data.get('password')
        
        # 模拟用户名密码验证(实际应用中应使用 Django 的认证系统)
        if username == 'user' and password == 'password':
            refresh = RefreshToken.for_user(username)  # 为用户生成 refresh_token
            return Response({
                'access': str(refresh.access_token),  # 返回 access_token
                'refresh': str(refresh),  # 返回 refresh_token
            })
        return Response({"error": "Invalid credentials"}, status=status.HTTP_400_BAD_REQUEST)

# 注销视图:将 refresh_token 加入黑名单
class LogoutView(APIView):
    def post(self, request):
        refresh_token = request.data.get('refresh')
        try:
            token = RefreshToken(refresh_token)
            token.blacklist()  # 黑名单化该 refresh_token
            return Response(status=status.HTTP_205_RESET_CONTENT)
        except Exception as e:
            return Response({"error": "Invalid refresh token"}, status=status.HTTP_400_BAD_REQUEST)

配置路由(urls.py)

# urls.py

from django.urls import path
from .views import LoginView, LogoutView

urlpatterns = [
    path('api/login/', LoginView.as_view(), name='login'),
    path('api/logout/', LogoutView.as_view(), name='logout'),
]

2. 前端(Vue 3)实现

在前端,我们使用 axios 来处理 HTTP 请求,假设我们通过登录表单获取 usernamepassword,然后将 access_tokenrefresh_token 存储在 localStorage

安装 axios

npm install axios

登录函数

import axios from 'axios';

function login(username, password) {
  axios.post('http://localhost:8000/api/login/', { username, password })
    .then(response => {
      const { access, refresh } = response.data;
      // 存储 token
      localStorage.setItem('access_token', access);
      localStorage.setItem('refresh_token', refresh);

      // 设置默认的 Authorization header
      axios.defaults.headers.common['Authorization'] = `Bearer ${access}`;
      
      console.log('Login successful!');
    })
    .catch(error => {
      console.error('Login failed:', error.response.data);
    });
}

注销函数

function logout() {
  const refreshToken = localStorage.getItem('refresh_token');

  axios.post('http://localhost:8000/api/logout/', { refresh: refreshToken })
    .then(() => {
      // 清除 token
      localStorage.removeItem('access_token');
      localStorage.removeItem('refresh_token');

      // 清除 axios 默认 header
      delete axios.defaults.headers.common['Authorization'];

      console.log('Logout successful!');
    })
    .catch(error => {
      console.error('Logout failed:', error.response.data);
    });
}

3. 流程

  • 登录:前端通过提供用户名和密码请求 /api/login/,成功后获得 access_tokenrefresh_token,并将其存储在 localStorage 中。
  • 注销:前端请求 /api/logout/,将 refresh_token 发送到服务器,后端将该 refresh_token 加入黑名单,前端清除存储的 token。
  • 请求认证:前端的后续请求需要携带 access_token,后端通过 Authorization header 来验证用户身份。

4. 请求认证

在后续的 API 请求中,前端会将 access_token 放在请求头中以进行认证:

axios.get('http://localhost:8000/protected-endpoint/', {
  headers: {
    Authorization: `Bearer ${localStorage.getItem('access_token')}`
  }
})
.then(response => {
  console.log('Authenticated request:', response.data);
})
.catch(error => {
  console.error('Authentication failed:', error.response.data);
});

小结

  • 登录:用户通过用户名和密码请求 POST /api/login/,获取 access_tokenrefresh_token
  • 注销:用户请求 POST /api/logout/,将 refresh_token 加入黑名单,前端清除 token。
  • 请求认证:前端的后续请求需要携带 access_token,后端通过 Authorization header 来验证用户身份。

标签:axios,示例,JWT,refresh,access,token,rest,error,注销
From: https://www.cnblogs.com/win1998/p/18548286

相关文章

  • Code128编码规则及示例
    编码格式​空白区域起始字符数据区域校验码结束字符空白区域所有字符条纹图像都是以黑色开始,白色结束,只有结束字符例外起始字符由于128码有三个字符集。所以有三个起始字符。 字符集包含字符值bsStartA全部大写字母和标点符号和特殊符号{2,1,1......
  • 鸿蒙NEXT应用示例:切换图片动画
     【引言】在鸿蒙NEXT应用开发中,实现图片切换动画是一项常见的需求。本文将介绍如何使用鸿蒙应用框架中的组件和动画功能,实现不同类型的图片切换动画效果。【环境准备】电脑系统:windows10开发工具:DevEcoStudioNEXTBeta1BuildVersion:5.0.3.806工程版本:API12真机:ma......
  • python调用扣子coze智能体示例
    """版本号:1.0日期:2024/11/14描述:"""importuuidimportjwtimporttimeimportrequests#OAuth应用的相关信息,需从扣子平台获取并替换APP_ID=""#auth应用idPUBLIC_KEY_FINGERPRINT=""#公钥PRIVATE_KEY_PATH="private_......
  • layui-laydate时间日历控件详细示例
     layui下载地址:http://www.layui.com/此控件可使用layui或者独立版的layDate,两者初始化有些不同1.在layui模块中使用layui.code<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>layDate快速使用</title><linkrel="stylesheet"......
  • 原子类保证多线程环境下的数据安全的示例
    原子类保证多线程环境下的数据安全的示例 1、原子整型类保证多线程环境下的数据安全示例:packagecom.joyupx.cms.example.thread.concurrent.atomic;importlombok.extern.slf4j.Slf4j;importjava.util.concurrent.atomic.AtomicInteger;/***原子性操作*多线程......
  • Arduino语法详解_含示例详解
    Arduino的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。  结构部分 一、结构1.1setup()1.2loop()二、结构控制2.1if2.2if...else2.3for2.4switchcase2.5while2.6do...while2.7break2.8continue2.9return2.10goto三、扩展语法......
  • Jmeter (5.6.3) Windows 使用示例
    步骤:1.下载apache-jmeter-5.6.3.zip2.解压,在环境变量Path中,新增jMeter的bin文件夹的路径3.在bin文件夹中,双击jmeter.bat->打开JMeter4.在JMeter的窗口中:文件->新建(创建测试计划)5.测试计划右键:添加->线程(用户)->线程组6.线程组右键:添加->取样器->HTTP请求7.HTTP请......
  • .net 8 实现【JWT】 十分钟领略【无状态设计】
      本文主要分为两个部分:  1、概念  2、.net8demo  第一部分主要描述所有与JWT相关的概念以及词汇,及其原理;第二部分是代码示例。  1、概念JWTjsonwebtoken是一种开放标准(RFC7519),是指定一种数据格式(json)和数据结构(header,payload,si......
  • pjsip编译、说明及vs2022使用示例
    环境:window10_x64&vs2022pjsip版本:2.14.1 之前整理过pjsip2.10的编译及python使用示例:https://www.cnblogs.com/MikeZhang/p/pjsip20210116.htmlhttps://www.cnblogs.com/MikeZhang/p/win10py3pjsua-20211010.html 今天整理下pjsip2.14.1的编译、接口说明,以及在vs......
  • [AIGC]使用阿里云Paraformer语音识别录音识别 API 进行音频处理 —— 完整流程及代码
    文章目录一、前提准备1.阿里云账号2.开通录音识别服务3.获取APIKey和AccessToken二、阿里云录音识别API的主要功能介绍三、完整代码流程1.导入依赖库2.设置环境变量3.生成Token4.上传文件并发起识别请求4.1请求4.2请将'{api-key}'替换为你的apikey,'{ta......