当前位置: 首页 > 后端技术 > Node.js

当token过期时,自动刷新token

时间:2023-04-03 20:30:07 Node.js

1。在开发过程中,我们都会接触到token。令牌的功能是什么?主要功能是为了安全。当用户登录时,服务器会随机生成一个时间敏感的令牌。用户的每一次请求都需要携带token来证明请求的合法性。服务器会对token进行验证,只有验证通过。返回请求结果。2、当token失效的时候,现在的网站一般会做两件事,一是跳转到登录页面让用户重新登录获取新的token,二是请求成功时自动请求新的token检测到无效的Token,更多的是使用第二种方式,让app保持登录状态。3.在下面输入主题。我们要求使用axios。无论使用何种请求方式,刷新token的原理都是一样的。//封装一个统一的请求函数,这个不是重点exportdefaultfunctionrequest(url,options){consttoken=localStorage.getItem('token');constdefaultOptions={headers:{Authorization:`Bearer${token}`,},withCredentials:true,url:url,baseURL:BASE_URL,};constnewOptions={...选项,...默认选项};returnaxios.request(newOptions).then(checkStatus).catch(error=>console.log(error));}//封装了一个检测返回结果的函数,返回状态码code===1002在背景表明令牌无效。letisRefreshing=true;functioncheckStatus(response){if(response&&response.code===1002){//刷新token的函数,需要加一个switch防止重复请求if(isRefreshing){refreshTokenRequst()}isRefreshing=false;//这个Promise函数很重要constretryOriginalRequest=newPromise((resolve)=>{addSubscriber(()=>{resolve(request(url,options))})});返回返回ryOriginalRequest;}else{返回响应;}}//刷新令牌请求函数refreshTokenRequst(){letdata;constrefreshToken=localStorage.getItem('refreshToken');data:{authorization:'YXBwYXBpczpaSWxhQUVJdsferraweERm,TeweERm=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函数集合letsubscribers=[];functiononAccessTokenFetched(){subscribers.forEach((callback)=>{callback();})subscribers=[];}functionaddSubscriber(callback){subscribers.push(callback)}总结:其实token是无效的,并且在页面处理只有一个请求的时候自动刷新token比较好,但是如果页面同时有多个请求,而且全部都会导致token失效,这个需要稍微复杂一些的处理。解决方案主要是使用Promise函数进行处理每个令牌失效请求都将存储在一组Promise函数中。执行完刷新token的函数后,会批量执行这些Promise函数,返回请求结果。另外需要注意的是这里设置一个refreshtoken开关isRefreshing是非常有必要的,可以防止重复请求。