小程序获取网站api接口access_token,怎么存储时效

it0_soft 2019-01-07 11:36:37
我的系统做有api接口,现在要小程序通过api访问接口获取access_token,这个token在全局怎么获取,token后端时效是默认7200秒,小程序前端要实现存储时效性,失效的话重新获取,我该怎么做呢?
...全文
1116 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
it0_soft 2019-02-15
  • 打赏
  • 举报
回复
引用 19 楼 風灬雲 的回复:
前端只要每次都带上token就可以了吧,是否失效关注的是后端接口返回的状态码,前端无法验证token的时效性
我用了前端缓存判断token是否存在,如果存在判断时间是否过去来实现,但是遇到问题了,onLaunch是异步的,总在onLoad之后执行,这就导致第一次获取的token是空值,只有在刷新一次后才会获取到值,这个该怎么整,App.js里代码如下:

 // 判断token 是否过期
    var tokenDate = wx.getStorageSync('tokenDate') || 'null';
    console.log(tokenDate)
    if (tokenDate == 'null') { // 如果为空的情况下  则去请求token  并缓存
      wx.request({
        url: 'http://api.hmxigou.com/api/5c22de286985d',
        method: 'GET',
        header: {
          'Content-Type': 'application/json',
          'version': 'v3.0'
        },
        data: {},
        success: (res) => {
          //定义当前时间戳
          var timestamp = Date.parse(new Date());
          //定义过期时间
          var mytime = timestamp + 7200000; //2个小时
          //存储token
          //.... 请求成功回调
          wx.setStorageSync('tokenDate', mytime); // token结束时间
          wx.setStorageSync('access_token', res.data.data.access_token)
          console.log(res)
          console.log('过期时间为空时定义缓存')
          console.log(wx.getStorageSync('access_token'));
        },
        fail: (res) => {
          wx.showToast({
            title: '网络异常',
            duration: 2000
          })
        }
      })
    } else { // 有token 的情况下  判断token 是否有效
      var nowDate = Date.parse(new Date());
      var tokenEndTime = wx.getStorageSync('tokenDate');
      //var endTime = new Date(tokenEndTime).getTime();

      if (nowDate >= tokenEndTime) { // 如果过期则 更新 token & token 时间
        //nowDate.setMonth(nowDate.getMonth() + 3);
        wx.request({
          url: 'http://api.hmxigou.com/api/5c22de286985d',
          method: 'GET',
          header: {
            'Content-Type': 'application/json',
            'version': 'v3.0'
          },
          data: {},
          success: (res) => {
            //定义当前时间戳
            var timestamp = Date.parse(new Date());
            //定义过期时间
            var mytime = timestamp + 7200000; //2个小时
            //存储token
            //.... 请求成功回调
            wx.setStorageSync('tokenDate', mytime); // token结束时间
            wx.setStorageSync('access_token', res.data.data.access_token)
            console.log(res)
            console.log('缓存到期了')
            //console.log(wx.getStorageSync('access_token'));
          },
          fail: (res) => {
            wx.showToast({
              title: '网络异常',
              duration: 2000
            })
          }
        })
      }
    }
  }
風灬雲 2019-02-14
  • 打赏
  • 举报
回复
前端只要每次都带上token就可以了吧,是否失效关注的是后端接口返回的状态码,前端无法验证token的时效性
it0_soft 2019-02-13
  • 打赏
  • 举报
回复
引用 17 楼 風灬雲 的回复:
引用 16 楼 it0_soft 的回复:
[quote=引用 14 楼 風灬雲 的回复:] [quote=引用 13 楼 it0_soft 的回复:] 自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. [quote=引用 12 楼 風灬雲 的回复:] qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
token是否失效是要后端API去验证的,前端没法保证准确判断token的有效性;所以说需要后端返回一个状态码,后端判断了token失效了,前端才去重新获取[/quote] 麻烦你看下我上面的回复[/quote] globalData我也没怎么研究过,之前的项目用的storage[/quote] 我也用了下storage,但是这个不会即时存储,如果token失效的话还不知道
風灬雲 2019-02-12
  • 打赏
  • 举报
回复
引用 16 楼 it0_soft 的回复:
引用 14 楼 風灬雲 的回复:
[quote=引用 13 楼 it0_soft 的回复:] 自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. [quote=引用 12 楼 風灬雲 的回复:] qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
token是否失效是要后端API去验证的,前端没法保证准确判断token的有效性;所以说需要后端返回一个状态码,后端判断了token失效了,前端才去重新获取[/quote] 麻烦你看下我上面的回复[/quote] globalData我也没怎么研究过,之前的项目用的storage
it0_soft 2019-01-31
  • 打赏
  • 举报
回复
引用 14 楼 風灬雲 的回复:
引用 13 楼 it0_soft 的回复:
自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. [quote=引用 12 楼 風灬雲 的回复:] qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
token是否失效是要后端API去验证的,前端没法保证准确判断token的有效性;所以说需要后端返回一个状态码,后端判断了token失效了,前端才去重新获取[/quote] 麻烦你看下我上面的回复
it0_soft 2019-01-31
  • 打赏
  • 举报
回复
我在app.js里面通过wx.request获取到access_token,赋值给that.globaData.access_token,怎么在别的页面取不到值呢

data: {},
      success: (res) => {
        that.globalData.access_token = res.data.data.access_token
      },
      fail: (res) => {
        wx.showToast({
          title: '网络异常',
          duration: 2000
        })
      }

globalData: {
    userInfo: null,
    server: 'http://api.hmxigou.com/api/',
    music_url: '',
    access_token: ''
  }

const app = getApp()
const access_token = app.globalData.access_token
我打印access_token居然是空值,在app.js里面没有对它修改吗?
風灬雲 2019-01-25
  • 打赏
  • 举报
回复
引用 13 楼 it0_soft 的回复:
自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token.
引用 12 楼 風灬雲 的回复:
qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
token是否失效是要后端API去验证的,前端没法保证准确判断token的有效性;所以说需要后端返回一个状态码,后端判断了token失效了,前端才去重新获取
it0_soft 2019-01-25
  • 打赏
  • 举报
回复
自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token.
引用 12 楼 風灬雲 的回复:
qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
hgwyl 2019-01-24
  • 打赏
  • 举报
回复
获取access_token——调用API接口——返回XXOO

每次调用接口的时候,都获取一下access_token?

可能我的习惯是这样…我是觉得每次都获取一下更好
it0_soft 2019-01-24
  • 打赏
  • 举报
回复
我给后台系统做了个API接口,每次访问这个接口必须是通过access_token去访问,而token设定的时效是2个小时,小程序在第一次访问接口的时候获取token,并在小程序端存储,我是在小程序端进行验证,我也不清楚这个在小程序端验证还是api后端验证?
引用 4 楼 hgwyl 的回复:
为啥要定时获取……? 如果涉及身份验证,获取完token,最终还是要用openid/unionid去对比数据库,将用户身份写入session。session设置个时效(比如7天)不就好了吗?
風灬雲 2019-01-24
  • 打赏
  • 举报
回复
qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
風灬雲 2019-01-24
  • 打赏
  • 举报
回复
写法和request一样的啊,就是把request的success回调统一处理

wx.ajax({
   url:"url",
   method:"POST",
   data:{},
   success(){},
   fail(){},
   complete(){}
})
it0_soft 2019-01-24
  • 打赏
  • 举报
回复
引用 8 楼 風灬雲 的回复:
一般是后端的接口先验证token,如果失效就返回一个状态码表示token失效,小程序端封装request方法,只要返回码是自己定的token失效状态就重新请求获取token
谢谢你的提示,看你这个代码封装的有点迷糊呢,qcloud.setLoginUrl(config.service.loginUrl); let opt = {} 请求方式,url怎么写?
風灬雲 2019-01-24
  • 打赏
  • 举报
回复
在app.js里面封装wx.ajax方法,项目里面所有的请求都用wx.ajax()

onLaunch: function(q) {
    qcloud.setLoginUrl(config.service.loginUrl);
    wx.ajax = (options) => {
      let opt = {};
      opt.url = options.url;
      options.data ? opt.data = options.data : null;
      options.header ? opt.header = options.header : null;
      options.method ? opt.method = options.method : null;
      options.dataType ? opt.dataType = options.dataType : null;
      options.responseType ? opt.responseType = options.responseType : null;

      if (qcloud.Session.get()) {//这里获取本地token,如果本地存在token就带上
        header["X-WX-SKEY"] = qcloud.Session.get().skey
      }
      for (let key in options.header) {
        header[key] = options.header[key]
      };
      opt.header = header
      opt.success = (res) => {
        wx.hideLoading()
          if(res.data.code===403){//假设定义403表示token失效
              //这里进行重新获取token操作 
            }else{
              if (typeof options.success === "function") {
                options.success(res.data)
              }
            }
        },
        opt.complete = () => {
          if (typeof options.complete === "function") {
            options.complete()
          }
        },
        opt.fail = (err) => {
           if (typeof options.fail=== "function") {
            options.fail()
          }
          //请求失败回调、提示网络错误操作
        }
      wx.showLoading({
        title: '网络请求中...',
        mask:true
      })
      wx.request(opt)
    }
  }
風灬雲 2019-01-24
  • 打赏
  • 举报
回复
一般是后端的接口先验证token,如果失效就返回一个状态码表示token失效,小程序端封装request方法,只要返回码是自己定的token失效状态就重新请求获取token
it0_soft 2019-01-24
  • 打赏
  • 举报
回复
获取 API的接口是独立的,我都是先获取token,然后才根据这个token去访问数据接口
hgwyl 2019-01-22
  • 打赏
  • 举报
回复
为啥要定时获取……?
如果涉及身份验证,获取完token,最终还是要用openid/unionid去对比数据库,将用户身份写入session。session设置个时效(比如7天)不就好了吗?
it0_soft 2019-01-21
  • 打赏
  • 举报
回复
引用 2 楼 ZHOU西口 的回复:
一种方式,第一次获取到token,在后台缓存,前端获取; 二钟方式,定时获取,刷新token;
token我是在第一次访问的时候就去获取到了,然后我保存在小程序端,设置失效时间为2个小时,那么我怎么在小程序端设置定时重新获取呢?
ZHOU西口 2019-01-08
  • 打赏
  • 举报
回复
一种方式,第一次获取到token,在后台缓存,前端获取;
二钟方式,定时获取,刷新token;
it0_soft 2019-01-07
  • 打赏
  • 举报
回复
没人啊,自己顶一下

3,143

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧