请求时token过期自动刷新token

2023-05-16

1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回请求结果。

2.当token失效时,现在的网站一般会做两种处理,一种是跳转到登陆页面让用户重新登陆获取新的token,另外一种就是当检测到请求失效时,网站自动去请求新的token,第二种方式在app保持登陆状态上面用得比较多。

3.下面进入主题,我们请求用的是axios,不管用何种请求方式,刷新token的原理都是一样的。

//封装了一个统一的请求函数,这个不是重点

export default function request(url, options) {
    const token = localStorage.getItem('token');
    const defaultOptions = {
        headers: {
            Authorization: `Bearer ${token}`,
        },
        withCredentials: true,
        url: url,
        baseURL: BASE_URL,
    };
    const newOptions = { ...options, ...defaultOptions };
    return axios.request(newOptions)
        .then(checkStatus)
        .catch(error => console.log(error));
}

// 封装了一个检测返回结果的函数,与后台返回状态码code === 1002表示token失效

let isRefreshing = true;
function checkStatus(response) {
  if (response && response.code === 1002) {
    // 刷新token的函数,这需要添加一个开关,防止重复请求
    if(isRefreshing){
        refreshTokenRequst()
    }
    isRefreshing = false;
    // 这个Promise函数很关键
      const retryOriginalRequest = new Promise((resolve) => {
                addSubscriber(()=> {
                    resolve(request(url, options))
                })
            });
            return retryOriginalRequest;
  }else{
      return response;
  }
}

// 刷新token的请求函数

function refreshTokenRequst(){
    let data;
    const refreshToken = localStorage.getItem('refreshToken');
    data:{
        authorization: 'YXBwYXBpczpaSWxhQUVJdsferTeweERmR1praHk=',
        refreshToken,
    }
    axios.request({
        baseURL: BASE_URL,
        url:'/app/renewal',
        method: 'POST',
        data,
    }).then((response)=>{
        localStorage.setItem('refreshToken',response.data.refreshToken);
        localStorage.setItem('token',response.data.token);
        onAccessTokenFetched();
        isRefreshing = true;
    });
}

// Promise函数集合

let subscribers = [];
function onAccessTokenFetched() {
    subscribers.forEach((callback)=>{
        callback();
    })
    subscribers = [];
}

function addSubscriber(callback) {
    subscribers.push(callback)
}

总结:其实token失效,自动刷新token,在页面只有一个请求的时候是比较好处理的,但是如果页面同时有多个请求,并且都会产生token失效,这就需要一些稍微复杂的处理,解决方式主要是用了Promise 函数来进行处理。每一个token失效的请求都会存到一个Promise函数集合里面,当刷新token的函数执行完毕后,才会批量执行这些Promise函数,返回请求结果。还有一点要注意一下,这儿设置一个刷新token的开关isRefreshing,这个是非常有必要的,防止重复请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请求时token过期自动刷新token 的相关文章

  • 将凭据/令牌保存在 cookie 中?

    我已经成功完成身份验证 我知道向客户端返回令牌 JWT 该令牌有一个到期日期 时间 因此我正在考虑将令牌保存在 cookie 中 以便对未来的登录进行身份验证 但这可能行不通 然后我考虑将用户名和密码保存在 cookie 中 尽管我知道不建
  • NodeJS 无法从 req.params.token 获取令牌值

    app post reset token function req res async waterfall function done User findOne local resetPasswordToken req params tok
  • django-rest-auth 重置密码 uid 和令牌

    我们的团队在后端使用 django rest api 进行项目 并在前端进行响应 对于身份验证 我们使用 django rest auth 并且我们在密码重置方面遇到问题 这里的网址 urlpatterns url r accounts i
  • Firebase 3.x - 令牌/会话过期

    有谁知道令牌需要多长时间才会过期 现在没有选项可以在控制台上设置令牌有效性 自 2016 年 5 月起 Firebase 身份验证登录会话不再过期 相反 他们使用长期帐户令牌和短期自动刷新访问 ID 令牌的组合来获得两全其美的效果 如果你想
  • 在 Rails 中创建帐户时创建随机、唯一的令牌

    我有一个使用 Devise 最新的 的 Rails 4 应用程序 并尝试为每个用户创建一个随机令牌 如 ID 但更长等 使用this https stackoverflow com questions 6021372 best way to
  • 标记和词位有什么区别?

    在 Aho Ullman 和 Sethi 的 Compiler Construction 一书中 给出了源程序的输入字符串被分成具有逻辑含义的字符序列 称为标记 而词位是组成标记的序列 所以什么是基本的区别吗 Using 编译器原理 技术和
  • 是否可以在elasticsearch中注册文档生命周期?

    我想创建一个函数 在elasticsearch中创建令牌文档 并为它们提供令牌生命周期 就像在redis中一样 并随着时间的推移自动删除它们 Elasticsearch 支持该功能吗 在 ES 2 0 很久以前 中 曾经有一个 ttl元数据
  • PHP 解析错误:语法错误,PHP 8.1 上的错误消息中出现意外标记“public”

    在 PHP 8 1 中运行时会触发上述错误消息 还没有发现任何明显的地方 即需要更改下面的代码以消除此错误消息 public function process button sid zen session name zen session
  • Azure AD - 始终需要范围,因此需要一个默认范围

    我已经为一家企业实施了 Azure AD 好吧 还没有完全完成 目的是只有企业中的人员可以使用它 他们必须位于企业的 Active Directory 中 并且存在仅分配给某些用户的特殊目标角色 范围 REST 端点用这些范围进行注释 在
  • gitlab - 使用 access_token 推送到存储库

    我实现了 oauth2 Web 流程 以便从我的应用程序的用户获取 access token 使用 access token 我想执行以下操作 获取用户信息 为该用户创建一个存储库 将代码推送到此存储库 使用 git push 我已经成功获
  • 如何在ElasticSearch中不进行分析?

    我不想分析 ElasticSearch 字段中的一个字段 即 e 应逐字保存和比较 这些值将包含字母 数字 空格 破折号 斜杠以及可能的其他字符 如果我没有在该字段的映射中提供分析器 则默认情况下仍使用分词器将我的逐字字符串分解为单词块 我
  • 使用 Firebase-PHP 验证 Firebase ID 令牌

    我正在使用 Firebase Auth 在以 PHP 编码的网络应用程序上授权用户 授权本身是用 Javascript 进行的 它在 Ajax 请求上执行以验证用户是否已登录 要在我已经实现的服务器上使用 Firebase AdminFir
  • 令牌访问中的 Google oAuth2 redirect_uri_mismatch

    我正在尝试使用 Google oAuth2 从一次性代码访问令牌 但我收到一条错误消息redirect uri mismatch在回应中 不过我已经添加了redirect uri在控制台中 我有我的Authorized redirect u
  • 如何获取设备令牌

    安装完成后 我需要获取 deviceToken 以用于其他目的 这是我到目前为止所开发的 Parse initialize this qqd423WEfwWEF32FewferT434fs323rfRT g7Rre4g7gsGRwgGw45
  • 唯一的表单令牌禁用用户的多任务处理

    如果我想保护我的网站和用户免受跨站伪造 CSRF 攻击 我可以生成一个唯一的令牌 token md5 time rand on 每一页有一个形式 令牌在隐藏的输入字段中提交echo
  • 缓存 auth_request 中的令牌

    我想缓存请求标头字段授权中的令牌 Authorization Bearer abcdefghijklmnopqrstuvwxyz 我的目标是 我不必验证验证服务器上的每个请求 如果授权令牌已缓存 且有效 则请求应调用 API 而无需验证 l
  • 用于 Java 的 JWT(JSON Web Token)库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个使用 Java 和 AngularJS 开发的 Web 应用程序 并选择实现令牌身份验证
  • 将 Dwolla 与 PHP 及其 API 集成

    前言 好吧 我过去使用过 API 例如 TwitterAPI 但我总是使用库和一些文档来帮助我进行连接和检索令牌 我对 API 的工作原理有了基本的了解 好的 我尝试了多种使用 PHP 请求 dwolla API 的方法 我尝试过制作一个
  • Keycloak-js updateToken(minValidity) 需要澄清

    我在Keycloak js中阅读了很多该方法的示例 但没有对以下方法进行明确的解释 updateToken minValidity number KeycloakPromise
  • “WSGIRequest”对象没有属性“successful_authenticator”

    我已经创建了一个像这样的身份验证类 RESTful API 的令牌身份验证 是否应该定期更改令牌 https stackoverflow com questions 14567586 token authentication for res

随机推荐

  • C语言头文件编程,C语言编程规范-头文件(Day2)

    1 头文件 背景 对于C语言来说 xff0c 头文件的设计体现了大部分的系统设计 不合理的头文件布局是编译时间过长的根本原因 xff0c 不合理的头文件实际上是不合理的设计 术语定义 依赖 xff1a 本章节特指编译依赖 若x h包含y h
  • Win10共享打印机所需要的设置(无需密码访问实现打印机共享,共享不要密码)...

    原文 xff1a https m baidu com from 61 1086k bd page type 61 1 ssid 61 0 uid 61 0 pu 61 usm 64 0 sz 64 1320 1002 ta 64 iphon
  • RBF神经网络的matlab简单实现

    径向基神经网络 1 径向基函数 Radial Basis Function xff0c RBF 神经网络是一种性能良好的前向网络 xff0c 具有最佳逼近 训练简洁 学习收敛速度快以及克服局部最小值问题的性能 xff0c 目前已经证明径向基
  • npm不是以管理身份运行遇到的问题

    环境 win10 43 npm3 10 5 问题 在npm install lodash时 出现下列错误 34 npm debug log 34 文件内容 0 info it worked if it ends with ok 1 verb
  • JSON_VALUE

    本页目录 语法入参功能描述示例 语法 span class pln style color rgb 0 0 0 VARCHAR JSON VALUE span span class pun style color rgb 102 102 0
  • 浮点数的表示方法

    计算机中浮点数的表示 never2die 长江大学湖北荆州 中文摘要 xff1a 本文介绍了浮点数在计算机中的几种表示方法 xff0c 并对此进行整理分析 xff0c 为人们以后做此方面的研究提供参考 中文关键词 xff1a 浮点数 xff
  • matlab 中atan2函数的介绍

    atan2 a b 是4象限反正切 xff0c 它的取值不仅取决于正切值a b xff0c 还取决于点 b a 落入哪个象限 xff1a 当点 b a 落入第一象限时 xff0c atan2 a b 的范围是 0 pi 2 当点 b a 落
  • 研究生毕业入职阿里,2年升职到P7,晒出真实月薪,以为看错了

    互联网企业已经成为现在大部分年轻人选择职业打拼的行业 xff0c 这个行业机会多 xff0c 有各种各样的职位和机会留给优秀的年轻人去闯 xff0c 但是相应的压力也非常大 毕竟高薪水的待遇下 xff0c 工作压力又怎么会轻松的了呢 xff
  • mac清理软件哪个好用?五大Mac Cleaner介绍推荐

    还在找好用的Mac清理软件吗 xff1f 你的Mac变慢了吗 xff1f 如果给你的Mac安装一款Mac清理软件 xff0c 可以删除Mac中不需要的垃圾文件 xff0c 以释放Mac的磁盘空间和内存 不知道mac清理软件哪个好用 xff1
  • 解决"SSL handshake failed"问题

    前阵子不知是对Ubuntu动了些啥 xff0c 结果Ubuntu One死活也不上 App Center上点击 34 Buy 34 按钮会提示 34 SSL handshake failed 34 猜想大概是由于同一问题导致的 网上给出的解
  • 当在Win8下安装msi类型的文件出现errorcode 2503的解决方法

    Win8安装程序出现2502 2503错误解决方法 在Win8中 xff0c 在安装msi安装包的时候常常会出现代码为2502 2503的错误 其实这种错误是由于安装权限不足造成的 xff0c 可以这种msi的安装包不像其他exe的安装程序
  • 极限编程实践

    摘自 xff1a 敏捷软件开发 xff1a 原则 模式与实践 Robert C Martin 著 xff0c 邓辉 译 极限编程实践 xff1a 1 完整团队 XP项目的所有参与者 xff08 开发人员 业务分析师 测试人员等等 xff09
  • keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 肯定可以的 xff1a 比如 程序动态显示字符 显示光标和光标闪烁打开效果 include 包含头文件 xff0c 义 include sbit RS 61 P2 4 定义端口 sbit RW
  • CircleProgressBar

    今天又写了一个demo xff0c 带有两个进度值的 圆环进度条 xff0c 原谅我是个小白 xff0c 只能写一写简单的自定义控件 xff0c 我会继续努力的 先看效果图 001 gif lt pre gt 64 Override pro
  • c++采集声卡输出_手机直播声卡转换器的分析与选购

    时下直播行业非常火爆 xff0c 相关周边产品五花八门 xff0c 良莠不齐 今天为大家带来的这篇长文 xff0c 旨在为选购设备苦恼的朋友提供帮助 闲话少叙 xff0c 开始正题 目前大家的使用的直播设备基本分为以下两种形式 xff1a
  • awk的使用及字符串的操作

    awk教程 awk的基本功能是对文件进行指定规则浏览和抽取信息 基本格式 xff1a 1 awk F 分隔域 39 command 39 input file s 2 写入shell脚本中 3 awk f awk script file i
  • VS2017安装后如何移动 Windows Kits文件夹

    MS的回答 LINK Try the following technique Close all programs move the Windows Kits folder to another disk for example to D
  • pytorch GPU的程序kill后未释放内存

    使用PyTorch设置多线程 xff08 threads xff09 进行数据读取 xff08 DataLoader xff09 xff0c 其实是假的多线程 xff0c 他是开了N个子进程 xff08 PID都连着 xff09 进行模拟多
  • 一个「学渣」从零Web前端自学之路

    从 13 年专科毕业开始 xff0c 一路跌跌撞撞走了很多弯路 xff0c 做过餐厅服务员 xff0c 进过工厂干过流水线 xff0c 做过客服 xff0c 干过电话销售可以说经历相当的 丰富 最后的机缘巧合下 xff0c 走上了前端开发之
  • 请求时token过期自动刷新token

    1 在开发过程中 xff0c 我们都会接触到token xff0c token的作用是什么呢 xff1f 主要的作用就是为了安全 xff0c 用户登陆时 xff0c 服务器会随机生成一个有时效性的token 用户的每一次请求都需要携带上to