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

本文介绍了微信小程序中实现token无感刷新的思路和流程,包括后端签发和验证token,前端封装登录和请求方法。当accessToken过期时,使用refreshToken发起刷新请求,获取新token并重新发送失败请求,确保用户无感知的登录体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、【实现思路】🚩

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

二、【流程图】🚩

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

image.png

三、【后端代码】🚩

1. ⌈签发和验证 token⌋🍥

  • 签发 accessToken 时,设置的过期时间是4个小时
  • 签发 refreshToken 时,设置的过期时间是7天
  • 自己在测试的时候,可以把时间改短一点,例如30s
  • 正常实现的效果是:登录时间超过4个小时之后,再次发送需要身份验证的请求,会使用 refreshToken 去请求刷新 accessToken;如果距离上次登录已经超过了7天,则会提示重新登录
### 微信小程序中实现无感刷新Token方案 为了确保用户在使用微信小程序期间不会因为Token过期而频繁重新登录,可以通过无感刷新机制来自动获取新的访问令牌。这不仅能提高用户体验,还能减少因手动操作带来的不便。 #### 1. Token管理逻辑设计 当首次成功调用微信登录接口并获得临时登录凭证code后,应立即请求服务器端换取session_key和openid,并由服务器返回一个有效的access_token给前端保存。此过程需严格按照OAuth2.0协议标准执行[^1]。 ```javascript // 登录接口示例 wx.login({ success(res) { if (res.code) { wx.request({ url: 'https://yourserver.com/getAccessToken', method: 'POST', data: { code: res.code }, success(result){ const accessToken = result.data.accessToken; // 存储accessToken到本地缓存 wx.setStorageSync('accessToken', accessToken); } }); } else { console.log('登录失败!' + res.errMsg); } } }); ``` #### 2. 自动续签策略 考虑到access_token的有效时间有限,在每次发起API请求前都应当先检查当前存储的token是否仍然有效。如果即将到期,则提前向服务器发送续约请求;若已失效则重定向至登录页面让用户再次授权。 ```javascript function checkAndRenewToken(callback) { let currentTime = new Date().getTime(); let expireTime = wx.getStorageSync('expire_time'); if (!expireTime || currentTime >= expireTime) { renewAccessToken((newToken, newExpireTime) => { wx.setStorageSync('accessToken', newToken); wx.setStorageSync('expire_time', newExpireTime); callback(newToken); }); } else { callback(wx.getStorageSync('accessToken')); } } function renewAccessToken(callback) { wx.login({ success(res) { if (res.code) { wx.request({ url: 'https://yourserver.com/renewAccessToken', method: 'POST', data: { code: res.code }, success(result){ const { access_token, expires_in } = result.data; let expireTime = new Date().getTime() + parseInt(expires_in)*1000 - 60*1000; // 提前一分钟触发更新 callback(access_token, expireTime); } }) } } }); } ``` 以上代码展示了如何通过`checkAndRenewToken()`函数判断现有token状态,并适时调用`renewAccessToken()`完成token的无缝切换。 #### 3. 安全注意事项 在整个过程中要特别注意保护好敏感信息的安全传输与储存: - 使用HTTPS加密通信; - 对于重要参数如code、access_token等建议采用签名验证方式防止篡改; - 尽量缩短单次会话有效期以降低风险暴露窗口; - 遵循最小权限原则仅授予必要的资源访问权。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值