一、关于 Refresh Token

之前公司项目中使用了 Refresh Token ,作为前端理解 Refresh Token 花了一些功夫。

为什么在已有 Access Token 的基础上还要再加一层 Refresh Token ?因为 Access Token 本身有过期时间,很多网站长时间不登录都会提示 Access Token 过期重新登录,然后某些记性不好的小伙伴就开始了忘记密码找回的流程,用户体验不是很好,而如果设置过长的 Access Token 过期时间那么安全性又会降低,Refresh Token 就解决了这两个矛盾的问题。

Refresh Token 由于仅仅用来请求普通 Token ,对安全性的要求没那么强烈,因此可以设置较长的过期时间,而当 Token 面临过期时,使用 Refresh Token 来重新获取 Access Token ,然后再用 Access Token 继续之前未完成的操作。

二、Vue 实现

后端需要专门的接口用来进行 Refresh Token 对 Access Token 的请求。

在 axios 的 http 拦截器里加入对 Refresh Token 和 Access Token 的相关处理。

1、获取 Token

export const getToken = () => {const tokenObj: TokenObj = {};// 从本地存储中获取 Refresh Token 和 Access Token 及它们的过期时间tokenObj.accessToken = localStorage.getItem('accessToken');tokenObj.accessTokenExpiresTime = localStorage.getItem('accessTokenExpiresTime');tokenObj.refreshToken = localStorage.getItem('refreshToken');tokenObj.refreshTokenExpiresTime = localStorage.getItem('refreshTokenExpiresTime');return tokenObj;
};

2、存储 Token

// 使用 axios 创建 http
export const http = axios.create({baseURL: process.env.VUE_APP_API_URL,withCredentials: false, // 跨域请求时发送 cookiestimeout: 30000
});export const setToken = (tokenObj) => {// 将 Access Token 添加进 http 默认请求头http.defaults.headers['Authorization'] = `${tokenObj.accessToken}`;Object.keys(tokenObj).forEach(key => {if (tokenObj[key]) {localStorage.setItem(key, tokenObj[key]);}});
};

2、判断接口是否是 Refresh Token 专用接口

export const setConfigHeaders = (tokenObj: TokenObj, config: AxiosRequestConfig) => {if (tokenObj.accessToken && tokenObj.refreshToken && config.url) {if (config.url.indexOf('/refresh-token') >= 0) {// 此处为 Refresh Token 专用接口,请求头使用 Refresh Tokenconfig.headers['Authorization'] = `${tokenObj.refreshToken}`;} else if (!(config.url.indexOf('/login') !== -1 && config.method === 'post')) {// 其他接口,请求头使用 Access Tokenconfig.headers['Authorization'] = `${tokenObj.accessToken}`;}}
};

3、请求拦截器处理

// 全局刷新状态,防止重复请求 /refresh-token 接口
window.isRefeshing = false;
// 原始请求队列
let requests: any = [];export function requestHandler(config: AxiosRequestConfig
): AxiosRequestConfig | Promise<AxiosRequestConfig> {// 获取本地存储的 Tokenconst tokenObj = getToken();// 将 Token 塞入请求头setConfigHeaders(tokenObj, config);if (config.url) {config.url = `/api/v1${config.url}`; // Restful Api 版本内容// 如果是 Refresh Token 专用接口或登录接口,不需要进一步处理if (config.url.indexOf('/refresh-token') >= 0 || config.url.indexOf('/login') >= 0) {return config;}}// 如果本地存储的 Token 相关内容无误,继续下一步处理if (tokenObj.accessToken && tokenObj.accessTokenExpiresTime && tokenObj.refreshToken && tokenObj.refreshTokenExpiresTime) {// 获取当前时间const now = Date.now();// 判断 Refresh Token 是否过期,要是它都过期了,那就要重新认证了if (now > tokenObj.refreshTokenExpiresTime) {clearToken();return config;}// Access Token 过期if (now > tokenObj.accessTokenExpiresTime) {if (!window.isRefeshing) {// 开始处理window.isRefeshing = true;// 请求 /refresh-token 接口authRefreshToken().then(data => {// 获取到全新的 Token 信息const {accessToken, accessTokenExpiresIn, refreshToken, refreshTokenExpiresIn} = data;// 计算出新的过期时间const accessTokenExpiresTime = now + accessTokenExpiresIn;const refreshTokenExpiresTime = now + refreshTokenExpiresIn;// 调用上文的 setToken 方法setToken({accessToken, accessTokenExpiresTime, refreshToken, refreshTokenExpiresTime});window.isRefeshing = false;return accessToken;}).then(token => {requests.forEach((cb: any) => cb(token));// 执行完成后,清空队列requests = [];}).catch(() => {// 错误则清除所有 Token 相关信息,让用户重新认证window.isRefeshing = false;clearToken();return config;});}// 原有的请求队列,在重新获取完 Access Token 后继续执行之前未完成的请求// 适用于同时多个请求的情况return new Promise(resolve => {requests.push((accessToken: string) => {config.headers['Authorization'] = `${accessToken}`;resolve(config);});});}}return config;
}

点此访问我的个人博客

Vue + Refresh Token相关推荐

  1. Vue中token刷新及token过期的实现

    总:通过axios,vuex,及自定义的方法实现. 以下是思路: 1.做token刷新必不可少的是,token(请求时的token) / refresh_token(刷新token时用的refresh ...

  2. 简单介绍vue获取token实现token登录的示例代码

    最近新做了个vue项目,正好项目中有登录部分,本文就详细的介绍一下登录部分的实现,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下 使用token做登录验证的思路大致如下: 1.在第一次登 ...

  3. 基于 JWT + Refresh Token 的用户认证实践

    HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案 ...

  4. Access Token 与 Refresh Token【转载哒科普啊】

    Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因为, ...

  5. SAP Spartacus 因为 refresh token 刷新令牌过期后显示用户重新登录页面的逻辑

    在 auth.interceptor.ts 里判断,token 是否过期: isExpiredToken: 通过服务器端返回的错误类型判断. 如果确实过期了,首先调用 handleExpiredTok ...

  6. 为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?

    What is the purpose of a "Refresh Token"? 问题:我有一个与 YouTube Live Streaming API 集成的程序.我以每 50 ...

  7. SAP云平台CloudFoundry的Access Token和refresh token

    refresh token -> access token 换取的access token,因为security原因,没有以明文的方式显示在控制台里: 要获取更多Jerry的原创文章,请关注公众 ...

  8. html5 js保存token,vue生成token并保存到本地存储中

    这篇文章主要为大家详细介绍了vue生成token并保存到本地存储中,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 首先回顾一下token: to ...

  9. 使用identity+jwt保护你的webapi(三)——refresh token

    前言 上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token. 开始 开始之前先说明一下为什么需要refresh token. 虽然jwt toke ...

  10. Vue 使用 token

    vue 解析 token 引入jwt-decode 包 npm install jwt-decode --save 在 vue 中引入jwt-decode import jwtDecode from ...

最新文章

  1. CSS5:移动端页面(响应式)
  2. 超融合刚刚好——蓝色光标成功应用联想超融合解决方案
  3. node 流学习笔记 - 可写流
  4. HDU 5882 Balanced Game 分析+欧拉图
  5. springboot细节挖掘(对测试的支持)
  6. 面试—每日一题(8)
  7. 见证激情燃烧的汤姆·彼得斯(Tom Peters)
  8. Kafka如何保证不丢数据?
  9. 深度学习优化算法入门:二、动量、RMSProp、Adam
  10. (转)MFC消息机制
  11. java向数据库添加中文乱码_java向数据库中插入中文出现乱码
  12. vue3安装WangEditor富文本编辑器v5版本
  13. java 修改分辨率_Java屏幕分辨率更改
  14. 解决VS2015无法打开WinSock2.h,无法找到ws2_32.lib
  15. SiO2 介孔二氧化硅纳米颗粒的明胶包裹/二氧化硅杂化凝胶固定化醇脱氢酶/白蛋白和壳聚糖包裹的二氧化硅微球/二氧化硅包覆的量子点荧光编码微球
  16. 【代码实现】tag-based-multi-span-extraction
  17. 【Win8操作系统中OEM分区创建技巧】
  18. 麦克风测试软件 ios,iOS开发麦克风权限判断
  19. 电脑输入法不见了怎么解决
  20. 每日小技巧~教你如何用 Python 快速批量转换 HEIC 文件

热门文章

  1. (一)、apache doris 介绍
  2. shell 脚本实现的 deamon 守护进程
  3. 英文科技论文写作中常见的问题和技巧(自用整理)
  4. LibEvent中文帮助文档
  5. wow大芒果mysql,大芒果魔兽世界3.3.5GM命令范例.doc
  6. 为Windows 10 UWP 应用设置代理
  7. 暗影精灵4电脑win10系统重装+linux双系统安装
  8. 易康EPS2的使用(一)
  9. 中国十大电商网站优势与劣势分析
  10. vue typeScript get set 用法