当前位置: 首页 > article >正文

登录获取token和刷新token两个接口是怎么用的???

登录获取 Token 和刷新 Token 是两个配合使用的接口下面是完整的使用流程和代码实现。一、两个接口的作用接口类型使用时机返回内容有效期登录接口用户首次登录accessToken refreshTokenaccessToken 短期如30分钟refreshToken 长期如7天刷新Token接口accessToken 过期时新的 accessToken 新的 refreshToken可选重新计时二、完整流程图用户登录 ↓ 调用登录接口 → 获取 accessToken refreshToken ↓ 存储到本地 ↓ 正常请求业务接口携带 accessToken ↓ ┌─────────────────┐ │ 接口返回401过期│ └─────────────────┘ ↓ 是 调用刷新Token接口携带 refreshToken ↓ 获取新的 accessToken ↓ 更新本地存储 ↓ 重试刚才失败的请求 ↓ 继续正常请求...三、完整代码实现1. 定义 API 接口// api/auth.jsconstBASE_URLhttps://your-api.com;exportdefault{// 登录接口login(data){returnuni.request({url:${BASE_URL}/login,method:POST,data:data});},// 刷新Token接口refreshToken(refreshToken){returnuni.request({url:${BASE_URL}/refresh,method:POST,data:{refreshToken:refreshToken}});}};2. 登录逻辑// pages/login/login.vueexportdefault{data(){return{username:,password:}},methods:{asynchandleLogin(){try{// 1. 调用登录接口constresawaitthis.$api.login({username:this.username,password:this.password});if(res.code0){const{accessToken,refreshToken,expiresIn,tokenType}res.data;// 2. 存储Tokenthis.saveToken({accessToken,refreshToken,expiresIn,// 有效期时长毫秒tokenType// Bearer 或 null});// 3. 跳转到首页uni.switchTab({url:/pages/index/index});}else{uni.showToast({title:res.msg||登录失败,icon:none});}}catch(error){console.error(登录失败,error);}},// 存储TokensaveToken(tokenData){constnowDate.now();// 存储基础信息uni.setStorageSync(accessToken,tokenData.accessToken);uni.setStorageSync(refreshToken,tokenData.refreshToken);uni.setStorageSync(tokenType,tokenData.tokenType||);// 计算过期时间绝对时间戳if(tokenData.expiresIn){uni.setStorageSync(expiresTime,nowtokenData.expiresIn);}elseif(tokenData.expiresTime){uni.setStorageSync(expiresTime,tokenData.expiresTime);}}}};3. 刷新Token逻辑// utils/refreshToken.js// 防止多个请求同时刷新Token锁机制letisRefreshingfalse;letrefreshSubscribers[];// 待刷新期间缓存的请求functionsubscribeTokenRefresh(callback){refreshSubscribers.push(callback);}functiononTokenRefreshed(newToken){refreshSubscribers.forEach(callbackcallback(newToken));refreshSubscribers[];}// 刷新TokenasyncfunctionrefreshAccessToken(){try{constrefreshTokenuni.getStorageSync(refreshToken);if(!refreshToken){// 没有refreshToken跳转登录redirectToLogin();returnnull;}// 调用刷新接口constresawaituni.request({url:https://your-api.com/refresh,method:POST,data:{refreshToken:refreshToken}});if(res.statusCode200res.data.code0){const{accessToken,refreshToken:newRefreshToken,expiresIn}res.data.data;// 更新存储uni.setStorageSync(accessToken,accessToken);uni.setStorageSync(expiresTime,Date.now()expiresIn);// 如果返回了新的refreshToken通常刷新接口也会返回新的if(newRefreshToken){uni.setStorageSync(refreshToken,newRefreshToken);}// 通知所有等待的请求onTokenRefreshed(accessToken);returnaccessToken;}else{// 刷新失败清空Token并跳转登录clearTokenAndRedirect();returnnull;}}catch(error){console.error(刷新Token失败,error);clearTokenAndRedirect();returnnull;}finally{isRefreshingfalse;}}// 跳转登录页functionredirectToLogin(){clearToken();uni.reLaunch({url:/pages/login/login});}// 清空TokenfunctionclearToken(){uni.removeStorageSync(accessToken);uni.removeStorageSync(refreshToken);uni.removeStorageSync(expiresTime);uni.removeStorageSync(tokenType);}// 导出刷新方法export{refreshAccessToken,clearToken,redirectToLogin};4. 请求拦截器自动处理Token过期// utils/request.jsimport{refreshAccessToken,redirectToLogin}from./refreshToken.js;// 请求队列存放过期期间等待的请求letrequestQueue[];letisRefreshingfalse;// 发起请求的核心方法functionrequest(config){returnnewPromise((resolve,reject){// 1. 检查Token是否过期constexpiresTimeuni.getStorageSync(expiresTime);constnowDate.now();// 判断是否需要刷新Tokenif(expiresTimenowexpiresTime){// Token已过期需要刷新if(!isRefreshing){isRefreshingtrue;// 刷新TokenrefreshAccessToken().then(newToken{if(newToken){// 刷新成功执行队列中的请求requestQueue.forEach(cbcb(newToken));requestQueue[];// 重新发起当前请求doRequest(config).then(resolve).catch(reject);}else{reject({message:Token刷新失败});}isRefreshingfalse;}).catch((){isRefreshingfalse;reject({message:Token刷新失败});});}// 将当前请求加入队列等刷新完成后重试requestQueue.push((newToken){// 更新config中的tokenconfig.headergetAuthHeader(newToken);doRequest(config).then(resolve).catch(reject);});}else{// Token未过期直接发起请求config.headergetAuthHeader();doRequest(config).then(resolve).catch(reject);}});}// 实际发起请求functiondoRequest(config){returnnewPromise((resolve,reject){uni.request({url:config.url,method:config.method||GET,data:config.data,header:config.header,success:(res){// 处理业务错误如Token无效if(res.datares.data.code401){// Token无效强制刷新refreshAccessToken().then((){// 重试请求request(config).then(resolve).catch(reject);}).catch((){redirectToLogin();reject({message:登录已过期});});}else{resolve(res);}},fail:(err){reject(err);}});});}// 获取认证请求头functiongetAuthHeader(customTokennull){consttokencustomToken||uni.getStorageSync(accessToken);consttokenTypeuni.getStorageSync(tokenType);if(tokenTypeBearer){return{Authorization:Bearer${token}};}else{return{accessToken:token};}}exportdefaultrequest;5. 实际使用示例// 在 main.js 中全局挂载importrequestfrom/utils/request.js;Vue.prototype.$requestrequest;// 在页面中使用// pages/index/index.vueexportdefault{asyncmounted(){try{// 自动处理Token过期和刷新constresawaitthis.$request({url:https://your-api.com/user/info,method:GET});console.log(用户信息:,res.data);}catch(error){console.error(请求失败:,error);if(error.message登录已过期){// 跳转到登录页uni.navigateTo({url:/pages/login/login});}}}};四、关键点总结1. 刷新策略主动刷新每次请求前检查剩余时间 5分钟就提前刷新被动刷新请求返回401时触发刷新2. 并发控制重要// 避免短时间内多次刷新TokenletisRefreshingfalse;// 锁标志letrequestQueue[];// 等待队列3. 刷新时机// 在请求拦截器中判断constexpiresTimeuni.getStorageSync(expiresTime);consttimeRemainingexpiresTime-Date.now();if(timeRemaining5*60*1000){// 剩余不足5分钟awaitrefreshAccessToken();// 提前刷新}4. Token失效后处理// 刷新接口也返回401时清空所有Token并跳转登录if(res.statusCode401){uni.removeStorageSync(accessToken);uni.removeStorageSync(refreshToken);uni.reLaunch({url:/pages/login/login});}五、注意事项refreshToken 也有有效期通常比 accessToken 长如7天、30天过期后需要重新登录刷新接口也要做防抖避免短时间内多次调用存储到本地时建议加密特别是 refreshToken登出时要同时清空accessToken 和 refreshToken刷新Token接口建议使用 POST 请求并将 refreshToken 放在 Body 中按照以上方案实现就能完美处理 Token 的获取和自动刷新了。

相关文章:

登录获取token和刷新token两个接口是怎么用的???

登录获取 Token 和刷新 Token 是两个配合使用的接口,下面是完整的使用流程和代码实现。一、两个接口的作用接口类型使用时机返回内容有效期登录接口用户首次登录accessToken refreshTokenaccessToken 短期(如30分钟)refreshToken 长期&#…...

腾讯会议企业管理员 REST API 实战:用户/部门批量管理与会议合规审计

本文适用于企业级管理员开发场景,代码基于腾讯会议 REST API v2,Python 3.x 示例。 参考文档:腾讯会议开放平台 API 文档 【内文配图1位置】 背景 中大型企业使用腾讯会议企业版后,IT 管理员通常面临以下管理需求: 批…...

视频人脸打码软件工具

引言随着视频录制、直播互动、公共终端应用的普及,人脸信息作为核心个人隐私,其保护需求日益迫切。无论是课堂录制中需要隐藏学生身份、直播场景下保护观众隐私,还是自助终端界面避免路人面部泄露,传统手动打码效率低下、易遗漏的…...

MySQL 索引底层深度解密:为什么 InnoDB 偏偏选中了 B + 树?

作为后端开发,我们每天都在和 MySQL 打交道,写 SQL 时张口就来 “加个索引优化一下”,面试时也总能脱口而出 “MySQL 索引底层是 B 树”。但只要面试官多追问一句:为什么不用二叉树、红黑树做索引?哈希表单点查询 O (…...

力扣算法刷题 Day 63 Bellman_ford 算法

队列优化 Bellman_ford 朴素算法在每一轮操作中对所有边进行松弛是不必要的。只需要对上一轮更新过的边进行计算就好&#xff0c;因此我们定义一个队列&#xff0c;初始化只有出发节点&#xff0c;之后其中为当前轮次加入的队列。 #include <iostream> #include <vect…...

ByteBase实战:基于Database-as-Code理念构建数据库DevOps协作中心

1. 项目概述与核心价值 最近在折腾一个内部小项目&#xff0c;需要把几个不同业务线的数据库变更流程统一管起来。这活儿听起来简单&#xff0c;但真做起来&#xff0c;从开发提工单、DBA审核、到最终执行和回滚&#xff0c;中间涉及的工具链、权限控制和审计日志&#xff0c;零…...

智能机器人学习知识库构建:从感知规划控制到AI决策实战

1. 从零到一&#xff1a;如何构建你的智能机器人学习知识库最近在整理自己的技术笔记时&#xff0c;发现很多朋友对机器人学&#xff0c;特别是智能机器人这个领域很感兴趣&#xff0c;但苦于入门资料零散、理论艰深。这让我想起了几年前在瓦萨大学&#xff08;University of V…...

C++版俄罗斯赌盘(爽到飞起)

俄罗斯赌盘是一款比较火的网络游戏而今天我用c加加代码复原了他&#xff0c;接下来请大家尽情欣赏源代码:#include <iostream> #include <vector> #include <queue> #include <cstdlib> #include <ctime> #include <algorithm> #include &…...

Linux48:rockx常用的API

rockx人脸检测使用的API rockx框架提供了一系列的人脸识别、检测的API&#xff0c;开发者使用它的API能够快速开发出人脸相关的功能。我们来看看在人脸检测中需要用到的API。 1.1 rockx_create函数的定义 rockx_ret_t rockx_create(rockx_handle_t *handle, rockx_module_t m…...

ChatGPT免费版数学暴涨24%,还藏了个语音大招

5月5号GPT-5.5 Instant上线&#xff0c;5月7号GPT-Realtime-2发布。 两天两发&#xff0c;一文本一语音。 免费用户直接拿到旗舰级智力&#xff0c;这事比跑分本身有意思。 ​ 不是阉割版&#xff0c;是旗舰智力配了极速响应 先说我判断变化的地方。 GPT-5.5 Instant刚发布时…...

四足机器人滑行控制:贝叶斯优化与强化学习协同设计

1. 四足机器人滑行控制的挑战与机遇四足机器人在复杂地形移动方面展现出巨大潜力&#xff0c;但传统行走模式在平滑地面上的速度和能效始终无法与轮式机器人媲美。2018年&#xff0c;苏黎世联邦理工学院的研究团队首次在ANYmal机器人上展示了被动轮滑行技术&#xff0c;相比传统…...

skillspm:AI智能体技能包管理器,实现环境管理的声明式工作流

1. 项目概述&#xff1a;为AI智能体设计的原生技能包管理器如果你正在构建或使用AI智能体&#xff08;比如Claude Code、OpenClaw这类工具&#xff09;&#xff0c;并且发现管理它们的“技能”&#xff08;Skills&#xff09;变得越来越复杂——不同项目需要不同的技能组合&…...

QT下载并安装

一、QT下载 1、从 Qt 5.15.0 开始&#xff0c;开源版本必须用在线安装器&#xff0c;不再提供离线安装包。 2、错误处理&#xff1a;./qt-online-installer-linux-x64-4.11.0.run: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28 not found (required by ./qt-online-…...

Redis别再只当缓存用!8种常用数据结构+实战选型,一看就会

大家好&#xff0c;我是直奔標竿&#xff01;做开发的朋友应该都有这种体会&#xff1a;学Redis入门&#xff0c;基本上都是从GET/SET开始&#xff0c;简单好记&#xff0c;上手也快。可一到实际项目里就犯难——不管什么数据&#xff0c;都往String里塞&#xff0c;到最后Redi…...

顶俏模式商城系统开发 单层直推积分流转架构解析

顶俏模式为什么能在私域电商里爆火近几年私域电商卷得厉害&#xff0c;各种新模式换着花样出来&#xff0c;能留到现在还被人追捧的&#xff0c;顶俏模式绝对算一个。很多人一开始看不懂&#xff0c;为什么偏偏是单层直推的模式火了&#xff0c;还不是因为之前不少多级分销踩了…...

SKILL推荐实战 - 80%测试覆盖率不是梦,而是标准工作流

❀ springboot-tdd是什么&#xff1f;springboot-tdd 是一个专为 Spring Boot 项目设计的测试驱动开发&#xff08;TDD&#xff09;技能。它提供了一套完整的测试工作流&#xff0c;覆盖从单元测试到集成测试的全链路。核心技术栈&#xff1a;JUnit 5 - 测试框架Mockito - Mock…...

高性能MCP服务器实战:AI应用通信优化与性能调优指南

1. 项目概述&#xff1a;一个为AI应用提速的“高速公路”接口最近在折腾AI应用开发的朋友&#xff0c;估计都绕不开一个词&#xff1a;MCP&#xff08;Model Context Protocol&#xff09;。简单来说&#xff0c;它就像是一个标准化的“插头”&#xff0c;让不同的AI模型&#…...

KES数据库安全、权限、审计实战

KES数据库安全、权限、审计实战这一章专门讲生产上线必过的安全关——等保2.0、三权分立、数据脱敏、操作审计、国密加密、权限最小化。内容全部来自政务/金融/央企真实上线场景&#xff0c;完全贴合KES官方安全规范&#xff0c;学完就能直接过等保、过检查、上线不踩坑。一、&…...

AI应用开发实战:基于Awesome清单构建生产级LLM客户端

1. 项目概述&#xff1a;一个AI客户端的“Awesome”清单意味着什么&#xff1f;最近在GitHub上闲逛&#xff0c;又发现了一个让我眼前一亮的项目&#xff1a;wlemuel/awesome-ai-client。光看这个标题&#xff0c;任何一个在AI应用开发领域摸爬滚打过一段时间的开发者&#xff…...

Captain AI:深度市场洞察,助力OZON商家精准把握商机

在瞬息万变的俄罗斯OZON电商市场&#xff0c;谁能率先发现市场趋势、洞察用户需求&#xff0c;谁就能在竞争中占据主动。然而&#xff0c;面对海量的市场数据和复杂的消费行为&#xff0c;传统的人工分析方式往往难以奏效。一、OZON市场分析的核心难点1. 市场趋势难以预判俄罗斯…...

使用Taotoken后模型API调用的延迟与稳定性体感观察

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后模型API调用的延迟与稳定性体感观察 在近期的虚拟机开发测试项目中&#xff0c;我们通过Taotoken平台统一接入了多个…...

浏览器资源嗅探技术:从碎片化视频流到完整内容获取的解决方案

浏览器资源嗅探技术&#xff1a;从碎片化视频流到完整内容获取的解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 当你在观看在线课程时突然…...

XNBCLI:3步搞定星露谷物语XNB文件解包打包的完整指南

XNBCLI&#xff1a;3步搞定星露谷物语XNB文件解包打包的完整指南 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli 想要修改星露谷物语中的游戏资源吗&#xff1f…...

告别布线困扰 ,TurMass Mesh 无线组网方案让农业物联网部署简单高效

农业是立国之本&#xff0c;畜牧业是农业经济的重要支柱。在数字农业和智慧畜牧的时代浪潮中&#xff0c;如何实现农业生产环境的全面感知、精准管控和科学决策&#xff0c;成为摆在广大农业从业者面前的重要课题。从大型温室大棚到广袤农田&#xff0c;从标准化养殖场到分散的…...

.NET Web API数据库游标性能优化与最佳实践指南

1. 项目概述与核心价值最近在重构一个遗留的.NET Web API项目时&#xff0c;遇到了一个让我头疼的问题&#xff1a;数据库查询性能在特定场景下急剧下降。经过层层排查&#xff0c;最终定位到罪魁祸首是几个写得不太规范的游标&#xff08;Cursor&#xff09;操作。这让我意识到…...

从“石头剪刀布”到商业竞争:用Python实战模拟完全信息静态博弈(附代码)

从“石头剪刀布”到商业竞争&#xff1a;用Python实战模拟完全信息静态博弈 博弈论常被视为经济学中的"数学武器库"&#xff0c;但它的魅力远不止于学术论文。当我们在电商平台比价时&#xff0c;当两家外卖App同时发放优惠券时&#xff0c;甚至当你在会议室与同事讨…...

别再死记硬背了!用一张图+实战代码,带你吃透USB PD协议里的24种控制消息

图解USB PD协议&#xff1a;24种控制消息的实战解码手册 在嵌入式开发领域&#xff0c;USB Power Delivery&#xff08;PD&#xff09;协议堪称电源管理的"瑞士军刀"&#xff0c;但协议文档中晦涩的状态机和抽象术语常常让开发者陷入"每个字都认识&#xff0c;连…...

深入解析系统级光标定制:从原理到实践打造个性化交互体验

1. 项目概述&#xff1a;从“换个鼠标指针”到打造个性化交互体验 “换个鼠标指针”听起来像是个微不足道的小把戏&#xff0c;对吧&#xff1f;我最初也是这么想的。但当我真正开始深入使用和定制 ashutoshbhole1/custom_cursor 这个项目时&#xff0c;我才意识到&#xff0…...

泰山派3M-RK3576-Linux内核驱动教程-Linux驱动基础-字符驱动设备-应用程序访问字符设备

06.应用程序访问字符设备 在上一个章节中&#xff0c;我们编写了一个驱动程序&#xff0c;这里我们要编写一个APP应用程序&#xff0c;实现在应用层调用驱动底层的 open 和 write 函数。 一、APP和驱动程序的区别与分工 1. 驱动程序&#xff08;Driver&#xff09; 工作在内核空…...

SPI 在 以太网 PHY、CAN 控制器 中的通信应用(原理 + 场景 + 接线 + 时序全覆盖)

一、核心总览SPI 在这两类器件里不是做业务数据总线&#xff0c;核心作用是&#xff1a;MCU 通过 SPI 对 PHY / CAN 控制器 做&#xff1a;配置初始化、寄存器读写、状态读取、故障诊断以太网 PHY&#xff1a;SPI 管理 PHY 寄存器、速率 / 双工、链路状态CAN 控制器&#xff08…...