微信小程序自动刷新token,无感刷新token

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

        小程序登录开发通常是调用wx.login获取code,然后发送到后台,后台请求微信拿到用户openId,然后根据openId查询用户,有就走登录流程然后返回token,没有则创建用户之后走登录流程然后返回token,也就是都需要返回一个有时效性的token给小程序端,来保持登录状态,并且后续请求都需要token来验证用户。

        那么就有一个问题,就是token的时效性,token过期,后台返回认证授权失败,那么怎么做到无感刷新token,让用户即使token过期了自动刷新token呢?经过查询跟实践,我封装了一个请求类。

        思路大致是根据后台返回的状态,如果返回的是授权失败,那么就会保存当前请求,调用刷新token的请求,成功之后再次发起之前保存的请求,这样就可以达到用户无感的刷新token。

        具体封装类api.js如下,本次代码采用uniapp框架开发,实际项目中每次发起后台请求只需要调用req方法即可做到无感刷新token:

微信小程序自动刷新token,无感刷新token,封装的api工具类https://download.csdn.net/download/weixin_47315082/88041695文章来源地址https://www.toymoban.com/news/detail-651137.html

//定义token在Storage中的key值
var tokenKey = "token";
//constant.js中定义请求url地址,例如baseUrl:http://192.168.0.5/api
import constant from './constant.js'

export function logout() {
    //退出时删除token
    uni.removeStorageSync('token')
}

//定义登录方法,传入wx.login获取到的code
export function login(data) {
    let header = {};
    header['Content-type'] =
        'application/json;charset=utf-8';
    return new Promise((resolve, reject) => {
        uni.request({
            //调动后台自定义微信登录方法,获取token
            url: constant.baseUrl + "/wxLogin",
            data: data,
            header: header,
            method: 'POST',
            success(res) {
                try {
                    if (res.statusCode === 200 && res.data.code === 200 && res.data.data.token && res.data.data.token !== "false") {
                        //获取成功,保存token到Storage中
                        uni.setStorageSync(tokenKey, res.data.data.token);
                        resolve(res.data)
                    } else {
                        //获取成功,删除当前Storage中的token
                        uni.removeStorageSync('token')
                        reject(res)
                    }
                } catch (e) {
                    console.log("res.data");
                    //请求失败
                    reject(e)
                }
            },
            fail(err) {
                console.log('request', err)
                //请求失败
                reject(err)
            }
        })
    })
}

//自定义通用请求类
export function req(config) {
    let method = config.method || 'GET';
    let url = config.url || "";
    let data = config.data || {};
    let header = config.header || {};
    //关键点:定义一个callback变量,来保存需要刷新token之后再次发起的请求
    let callback = config.callback;
    header['Content-type'] = config.contentType || (method == 'POST_PARAMS' ? 'application/x-www-form-urlencoded' :
        'application/json;charset=utf-8');
    //获取当前Storage中的token值
    let tokenValue = uni.getStorageSync(tokenKey) || ' ';
    //这里自定义请求,如果请求url中包含"/f/",说明该请求不需要验证token,否则就需要,将token值存入请求头中供后台验证,'Authorization'为后台自定义token的请求头key值
    if (url.indexOf("/f/") < 0) {
        header['Authorization'] = tokenValue;
    }
    return new Promise((resolve, reject) => {
        //发起请求
        uni.request({
            url: constant.baseUrl + url,
            data: data,
            header: header,
            method: method,
            success(res) {
                //如果callback存在,说明是需要再次发起请求,直接调用callback即可
                if (callback) {
                    return callback(res.data);
                }
                if (res.statusCode === 401 || res.data.code === 401) {
                    //如果返回401,说明当前token认证授权失败,也就是说需要刷新token
                    if (tokenValue && tokenValue !== ' ') {
                        //删除当前无效token
                        uni.removeStorageSync('token');
                    }
                    //调用重新获取token方法
                    getNewToken().then((res) => {
                        //获取token成功,将当前请求存入到callback
                        config.callback = resolve;
                        //获取token成功,重新发起请求
                        req(config)
                    })
                } else if (res.statusCode === 200) {
                    //token有效,返回成功
                    resolve(res.data)
                }
            },
            fail(err) {
                console.log('request', err)
                //请求失败
                reject(err)
            }
        })
    })
}

//重新获取token
export function getNewToken() {
    return new Promise((resolve, reject) => {
       //调用uni.login获取小程序用户code 
       uni.login({
            success(res) {
                //调用login登录
                let loginRes = login({
                    code: res.code
                });
                resolve(loginRes);
            },
            fail(err) {
                reject()
                console.error('wx login fail', err);
            }
        });
    })
}

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

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

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

相关文章

  • 小程序token过期后, 实现无感知的刷新token

    当我们使用在小程序中做用户登录的时候, 后台给用户一个token, 小程序端用本地缓存token ,以后每次请求的时候,带上这个token 发起请求, 后端解析token中的数据, 查看是否有过期,或其它的错误, 如果正常的话, 后端是可以从这个token中 确认这个请求是哪一个用户发送过

    2024年02月11日
    浏览(47)
  • 【JWT】SpringBoot+微信小程序根据指定参数生成Token、更新Token、判断Token是否已经过期、封装wx.request请求更新Token并判断Token是否过期

    微信小程序js代码 微信小程序点击登录按钮调用该方法 java后端代码 getUserCode方法为获取用户的唯一标识openId userLogin方法用于用户授权登录并获取Token userLogin实现类方法 封装了wx的request请求,每次发起请求的时候都走一遍更新Token的接口/user/updateTokenTime,如果接口返回offlin

    2024年02月04日
    浏览(53)
  • 无感刷新 token

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(51)
  • 前端刷新token,判断token是否过期,若没有过期则刷新token,过期则退出登录

    vue+axios 假设后端设置的token过期时间为10分钟。那么登录以后,过十分钟后token就会过期,这时再去操作系统,所有的请求都不能用,都会报token过期,需要重新登录才能继续操作系统。这样的方式显然是不合理的,为了解决这个问题,就需要在一段时间内刷新token。 在请求拦

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

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

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

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

    2024年01月18日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包