【微信小程序】 token 无感刷新

这篇具有很好参考价值的文章主要介绍了【微信小程序】 token 无感刷新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⌈本文是作者本人学习过程中的笔记总结,若文中有不正确或需要补充的地方,欢迎在评论区中留言⌋🤖

一、【实现思路】🚩

  1. 小程序端登录时,除了返回用户信息,还需返回两个 token 信息
    • accessToken:用于验证用户身份
    • refreshToken:用于刷新 accessToken
  2. 当请求返回状态码为401(即 accessToken 过期)时,使用 refreshToken 发起刷新请求
  3. 刷新成功会拿到新的 accessToken 和 refreshToken
  4. 然后使用新的 accessToken 将失败的请求重新发送

二、【流程图】🚩

图中为大致流程,为了看起来简洁直观,略去了与本文内容不相关的步骤

小程序双token刷新后发起请求,微信小程序,小程序

三、【后端代码】🚩

1. ⌈签发和验证 token⌋🍥

  • 签发 accessToken 时,设置的过期时间是4个小时
  • 签发 refreshToken 时,设置的过期时间是7天
  • 自己在测试的时候,可以把时间改短一点,例如30s
  • 正常实现的效果是:登录时间超过4个小时之后,再次发送需要身份验证的请求,会使用 refreshToken 去请求刷新 accessToken;如果距离上次登录已经超过了7天,则会提示重新登录
  • 这样的话,实现了一定的安全性(因为 accessToken 每隔4个小时就会更新),同时又没有让用户频繁地重新登录

2. ⌈登录⌋🍥

  • 拿到请求参数中的登录凭证(code),以及保存的 appId 和 appSecret
  • 基于上述三个参数发送请求到微信官方指定的服务器地址,获取 openid
  • openid 是小程序登录用户的唯一标识,每次登录时的登录凭证(code)会变,但是获取到的 openid 是不变的
  • 根据 openid 在数据库中查找用户,如果没有查找到,说明本次登录是当前用户的首次登录,需要创建一个新用户,存入数据库中
  • 然后根据用户 id 以及设置的签发密钥进行 accessToken 和 refreshToken 的签发
  • 签发密钥可以是自己随意设置的一段字符串,两个 token 要设置各自对应的签发密钥
  • 这个签发密钥,在进行 token 验证的时候会使用到

四、【前端代码】🚩

1. ⌈封装的登录方法⌋🍥

  • 在创建微信小程序项目时,默认是在根目录下 app.js 的 onLaunch 生命周期函数中进行了登录
  • 也就是说每次在小程序初始化的时候都会进行登录操作
  • 作者这里是把登录操作单独提取出来了,这样可以在个人主页界面专门设置一个登录按钮
  • 当本地存储的用户信息被清除,或者上面提到的 refereshToken 也过期的情况下,我们点击登录按钮进行登录操作
import { loginApi } from '@/api/v1/index'

const login = async () => {
  try {
    // 登录获取 code
    const {code} = await wx.login()
    // 调用后端接口,获取用户信息
    const {user, accessToken, refreshToken} = await loginApi(code)
    wx.setStorageSync('profile', user)
    wx.setStorageSync('accessToken', `Bearer ${accessToken}`)
    wx.setStorageSync('refreshToken', refreshToken)
  } catch (error) {
    wx.showToast({
      title: '登录失败,请稍后重试',
      icon: 'error',
      duration: 2000
    })
  }
}

export default login

2. ⌈封装的请求方法⌋🍥

  • 接收5个参数:url、method、params、needToken、header(点击展开)
    • url: 请求地址,是部分地址(例如:/auth/login),后面处理时会将其与设置的 baseUrl(例如:http://localhost:4000/api/v1) 进行拼接
    • method:请求方法,默认值为 'GET'
    • params:请求参数,数据格式为 object,例如: {name: 'test'}
    • needToken:是否需要需要携带 token(即是否需要身份验证),默认值为 false
    • header:请求头信息,数据格式为 object(例如: {'Content-Type': 'application/json'}),默认值为 null
  • 需要携带 token 的请求,先从本地存储中取出 accessToken 信息,然后将其赋值给 header 中的 Authorization 属性(注意:首字母要大写)。在上面的验证 token 代码中,会根据 req.headers.authorization.split(' ')[1] 获取到请求头中传递的 accessToken 信息

  • 调用 wx.request 发送请求,在 success 回调函数中判断请求返回信息中的状态码,根据状态码的不同做对应的操作,这里只讨论401 token 过期的情况

  • 当 token 过期时,从本地存储中获取到 refreshToken,然后调用对应后端接口刷新 token(点击展开)
    • 在刷新请求发送前,需要先判断是否已经有刷新请求被发送且正在处理中(基于 isTokenRefreshing 标识)
    • 如果有,则不必再重复发送刷新请求,但是需要把本次因为 401 token 过期而导致失败的请求存起来(放入 failedRequests 数组中),等待当前正在处理的 token 刷新请求完成后,使用新的 accessToken 重新发送本次请求
    • 如果没有,则发送刷新请求,同时修改 isTokenRefreshing 标识的值为 true
  • 等待刷新请求完成,将返回的新 accessToken 和 refreshToken 存储起来

  • 然后将 failedRequests 中因为等待 token 刷新而存储起来的失败请求,基于新的 accessToken 重新发送文章来源地址https://www.toymoban.com/news/detail-810373.html

  • 最后将本次因为 401 token过期导致失败的请求,基于新的 accessToken 重新发送(点击展开)
    • 本次操作正常进行 token 刷新请求,说明本次请求也是 token 过期了,而且因为 isTokenRefreshing 标识为 false, 没有将本次失败的请求存入 failedRequests 中

【源码】🚩

  • 后端源码:github.com/Yu19980809/…
  • 前端源码:github.com/Yu19980809/…

【说明】🚩

  • 文中涉及到的代码都是作者本人的书写习惯与风格,若有不合理的地方,欢迎指出
  • 如果本文对您有帮助,烦请动动小手点个赞,谢谢

到了这里,关于【微信小程序】 token 无感刷新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序基于Promise封装发起网络请求

         

    2024年02月17日
    浏览(44)
  • 无感刷新 token

    前景提要: ts 简易封装 axios,统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 无感刷新 token 一般指的是使用 refresh token 无感刷新 access token。 设置全局请求拦截器,从 localstorage 或其他地方获取 token 放在请求头中携带。在响应拦截器中,判断响应结果中是否

    2024年02月06日
    浏览(32)
  • Vue 无感刷新token

    关于无感刷新的理解:  实现token无感刷新对于前端来说是一项非常常用的技术,其本质是为了优化用户体验,当token过期时不需要用户跳回登录页重新登录,而是当token失效时,进行拦截,发送刷新token的请求,获取最新的token进行覆盖,让用户感受不到token已经过期 刷新token的一些方案

    2024年02月10日
    浏览(31)
  • 无感刷新:Vue前端实现Token的无缝刷新机制

    在现代Web应用程序中,用户身份验证和授权通常使用令牌(Token)机制来实现。然而,由于Token的过期时间限制,用户在长时间使用应用程序时可能需要重新登录。为了提供更好的用户体验,我们可以通过实现Token的无感刷新机制来避免用户在使用过程中的中断。本文将探讨如

    2024年02月10日
    浏览(29)
  • 前端实现token的无感刷新--VUE

    token刷新的方案    方案一:后端返回过期时间,前端判断token过期时间,去调用刷新token的接口    缺点:需要后端提供一个token过期时间的字段;使用本地时间判断,若本地时间被修改,本地时间比服务器时间慢,拦截会失败。    方案二:写个定时器,定时刷新token接口

    2024年02月19日
    浏览(29)
  • VUE前端实现token的无感刷新

    说实话,这个其实没啥好讲的,要说有复杂度的话,也主要是在后端。 实现token无感刷新对于前端来说是一项十分常用的技术,其本质都是为了优化用户体验,当token过期时不需要用户调回登录页重新登录,而是当token失效时,进行拦截,发送刷新token的请求,获取最新的tok

    2024年02月05日
    浏览(37)
  • VUE前端实现token的无感刷新,即refresh_token

    通常,对于一些需要记录用户行为的系统,在进行网络请求的时候都会要求传递一下登录的token。不过,为了接口数据的安全,服务器的token一般不会设置太长,根据需要一般是1-7天的样子,token过期后就需要重新登录。不过,频繁的登录会造成体验不好的问题,因此,需要体

    2024年02月09日
    浏览(29)
  • 为什么使用双token实现无感刷新用户认证?

    认证机制 :对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处: 安全性较低(因为只有一个token在客户端和服务器端之间进行传递,一目Acess Token被截获或者被泄露,攻击者就会在有效时间内完成模拟用户行为,

    2024年01月18日
    浏览(39)
  • 记录-使用双token实现无感刷新,前后端详细代码

    近期写的一个项目使用双token实现无感刷新。最后做了一些总结,本文详细介绍了实现流程,前后端详细代码。前端使用了Vue3+Vite,主要是axios封装,服务端使用了koa2做了一个简单的服务器模拟。 jwt:JSON Web Token。是一种认证协议,一般用来校验请求的身份信息和身份权限。

    2023年04月24日
    浏览(29)
  • 微信小程序wx.canvasToTempFilePath压缩上传图片,ios压缩成功但是数据sm2加密后无法发起请求,安卓一切正常

    吐槽遇到的问题~ 在写微信小程序的时候,采用wx.canvasToTempFilePath压缩图片且上传的时候,安卓一切正常,我在开发工具上也一切正常,偏偏ios上就不正常,不正常不是指压缩失败,而是明明也压缩成功了,竟然发不起网络请求,离大谱。因为所有请求的入参都会经过sm2加密,

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包