token和refreshToken

431 阅读2分钟

为什么会有refreshToken

token是有时效的 假如token时效是2s(实际当然不会这么短这里只是为了理解)则用户会在浏览需要token的界面过程中因为token失效而强制跳转到登陆页 对用户体验非常不友好 所以引入了refreshToken

refreshToken作用

当token失效后refreshToken会重新发送请求获取新的token 这个请求一般会返回新的refreshToken和新的token这时我们就可以将新的token重新覆盖旧来的token

当然refreshToken也是有时效的 有的人认为为什么不直接延长token时效而非要refreshToken来延长token时效 这个本菜鸟目前理解是单一的token如果被打手知道容易安全隐患所以token时效一般不长 希望有大佬指点一下

第一步 配置请求拦截器

任意界面的js文件中

Page({
  onLoad(){ 
   wx.hhtp.get('/root')         //发送请求获取数据
          }
   })
  


utils文件中                      //为了可维护性 创建的文件 方便配置接口基地址,请求+响应拦截器

//请求拦截器  
http.intercept.request = (config) =>{      
const token = getApp().token                                  
if(token){                                    //判断有无token 有则添加请求头

config.header = {                           

Authorization:token,                         //添加请求头
...config.header                             //考虑到可能携带其他信息
 }
}
return config                                       
}

第二步配置 存储token和refresh_token

登陆页面组件中
  getApp().setToken(data.token,  data.refresh_token)   //data.token :data是 token外面的一层



 这里我配置在全局里 因为比较常用所以需要放在全局方便调用
 
  //存储代码为  之前有在全局声明tonke refresh_token
 setToken( token, refresh_token ) {                       
 
   const temp  = 'Bearer ' + token                    //设置变量来存储 token 和refresh_token
   const refresh_token =  'Bearar ' + refresh_token
   
   this.token = temp                                //赋值给全局公用的 token 和refresh_token
   this.refresh_token = refresh_token
   
   wx.setStorageSync('token' , temp)                   //存储
   wx.setStorageSync('refresh_token' , refresh_token)
   
  }
  

三. 启动小程序时获取tonke 和refresh_token

   tonke :'',
   refresh_token:'', 
 onLaunch(){                                      //小程序一启动就获取本地的token存储到全局
    this.getToken()
    this.getrToken()
    }
getToken(){                                       //函数
     const token = wx.getStorageSync('token')     //从本地获取
     this.token = token                           //存本地
     }                        
getrToken(){
     const efresh_token = wx.getStorageSync('efresh_token')
     this.efresh_token = efresh_token
     }
     +第二部内容
     )}

四 刷新token 和 无感刷新 在响应拦截器配置

http.intercept.response = async (res) =>{       //响应拦截器         请求拦截器:request
    console.log(res)                           //可以方便看数据
   if(ret.statusCode === 401 ){                //token失效
      console.log('token 失效 ')     
      
          // 第五点 refreshToken失效 处理
          
      const res2 =  await http ({         //通过发送refreshToken来获取新的token
        url:'/refreshToken', 
        method:'POST',
        header:{
          Authorization: getApp().refresh_token,
          },
        )}  
      
   getApp().setToken(res2.data.token , res2.data.refreshToken) //存本地并覆盖旧值   
   
   return http({                                        //当请求有错误时
    ...res.config
    header:{
     Authorization: getApp().token,                    //覆盖token 
     },
    )}
   } 

第五点 refreshToken失效 处理 因为refreshToken也是失效的然后获取不到token 也就是说会一直 进行 逻辑 token失效 需要 refreshToken来获取新的token 的逻辑死循环

  if(res.config.url.endsWith('refreshToken')){             
    const pageStack = getCurrentPages()
    const current = pageStack[pageStack.length - 1]     
    const url = current.route
    
   return wx.redirectTo({                               // 跳转登录页重新登录
     url: '/pages/login/index?backTo=/' + url,
     })
   }