微信小程序,登录会话token检查 及失效处理

一. 客户端app.js代码

App({
  onShow: function () {},

  onLaunch: function () {
    this.loadToken();
    this.checkToken()
  },

  globalData: {
    token: null,
    host: 'https://www.test.com',
  },

  loadToken: function (e) {
    var token = wx.getStorageSync('token');
    if (token) {
      this.globalData.token = token
    } else {
      this.login();
    }
  },

  login: function (callback) { // 定义 login 函数
    // 尝试自动登录
    wx.login({
      success: function (res) {
        if (res.code) {
          // 获取用户信息
          wx.getUserInfo({
            success: function (userRes) {
              var encryptedData = userRes.encryptedData;
              //console.log("res.code=" + res.code + ",--------app.js(login),返回用户信息json------=" + JSON.stringify(userRes));
              var iv = userRes.iv;
              // 将code、encryptedData和iv发送到后台服务器进行验证和解密
              wx.request({
                url: getApp().globalData['host'] + '/login',
                method: 'POST',
                data: {
                  code: res.code,
                  encryptedData: encryptedData,
                  iv: iv
                },
                success: function (response) {
                  //console.log(response.statusCode); // 打印服务器响应的状态码
                  //console.log(response.data); // 打印服务器返回的响应数据
                  if (response.statusCode === 200) {
                    //console.log('自动登录成功' + JSON.stringify(response.data.userInfo));
                    // 将用户信息保存到全局App实例中
                    //console.log("token=" + response.data.token); // 打印服务器返回的响应数据
                    getApp().globalData.token = response.data.token;
                    getApp().globalData.userInfo = response.data.userInfo;
                    wx.setStorage({
                      key: 'token',
                      data: response.data.token,
                      success: function () {
                        console.log('--- 保存token到storage 成功');
                      }
                    });
                    // 进行其他初始化操作
                    // 调用其他初始化函数或跳转到其他页面等
                  } else {
                    console.error('自动登录失败');
                    // 处理自动登录失败的情况
                  }
                },
                fail: function (error) {
                  console.error('自动登录失败', error);
                }
              });
            },
            fail: function (userRes) {
              console.error('获取用户信息失败', userRes);
              // 处理获取用户信息失败的情况
            }
          });
        } else {
          console.error('获取用户登录态失败', res.errMsg);
          return; // 处理获取用户登录态失败的情况
        }
      },
      fail: function (error) {
        console.error('wx.login()调用失败', error);
        return; // 处理wx.login()调用失败的情况
      }
    });
  },

  checkToken: function () {
    var token = this.globalData.token;
    console.log('--------------------token=' + token);

    if (token) {
      // 发送请求验证 token
      return new Promise((resolve, reject) => {
        wx.request({
          url: this.globalData.host + '/checkToken',
          method: 'POST',
          data: {
            token: token
          },
          success: function (response) {
            if (response.statusCode === 200) {
              if (response.data.success) {
                console.log('Token 有效');
                return;
              } else {
                console.error('Token 无效ABC');
                return getApp().login() // Token 无效,调用 login 函数获取新的 token
              }
            }
          },
          fail: function (error) {
            console.error('Token 验证失败', error);
            return getApp().login() // Token 验证失败,调用 login 函数获取新的 token
          }
        });
        setTimeout(() => {
          console.log("异步函数执行完毕");
          resolve();
        }, 500);
      });
    } else {
      console.error('Token 不存在'); // 不存在,调用 login 函数获取的 token
      return new Promise((resolve, reject) => {
        this.login()
        setTimeout(() => {
          console.log("异步函数执行完毕");
          resolve();
        }, 500);
      });
    }
  },

});

二. 客户端调用代码

    this.checkToken().then(() => { // 使用Promise确保在异步函数执行完毕后执行下一个语句
      const d = {
        token: this.globalData.token, //一定要在then()内,引用这个token,否则,会把旧的token传递进来,引起混乱
        action: action,
        key: key,
        value: value
      };

      //console.log("-------monday= " + JSON.stringify(d));
      wx.request({ //console.log("异步函数执行后继续");
        url: this.globalData['host'] + '/week/save',
        method: 'POST',
        data: JSON.stringify(d),
        success: function (response) {
          if (response.statusCode === 200) {
            console.log(action + " key '" + key + "' 到远程redis成功");
          } else {
            console.error(action + " key '" + key + "' 到远程redis失败", response.statusCode);
          }
        },
        fail: function (error) {
          console.error(action + " key '" + key + "' 到远程redis失败", error);
        }
      });

    });

三. 服务端代码思路

1)在初始客户端登录时,在服务端接收到客户端传来的3个参数(,iv,encryptedData ,code),通过微信类,解析出微信用户的user_openid,然后新生成一个token字符串,将2者对应关系,存入到服务端的redis或者mysql,然后下发这个token。

2)客户端每次向服务端传递用户身份时时,都要发送这个token,服务端取出微信user_openid,保存处理相关业务逻辑数据。

3)服务端也要编写checkToken()函数和客户端的checkToken()函数对应。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值