TNWX icon indicating copy to clipboard operation
TNWX copied to clipboard

多账号accesstoken是否存在错乱问题

Open GavinSun09 opened this issue 4 years ago • 7 comments

问题描述

我查看了一下所有接口的发送逻辑,先从缓存获取accesstoken

let accessToken: AccessToken = await OpenCpAccessTokenApi.getAccessToken(AccessTokenType.SUITE_TOKEN)

当多个服务号或企业号时,我们调用接口时需要先设置当前的appId并存入缓存ApiConfigKit.setCurrentAppId(appId) 然后去调用接口,上面代码获取到的token是根据缓存中当前的appId去取token,但是如果多个人同时操作,因为是异步操作,可能存在我发送请求时,当前的appId已经发生变化,获取到的token已经不是我这个appid所对应的token

GavinSun09 avatar Apr 08 '20 03:04 GavinSun09

你有好的解决方案吗?一起讨论一下

Javen205 avatar Apr 19 '20 07:04 Javen205

我这边根据目前的结构想到的是2种。

  1. 把appid 当作变量传进每一个接口方法里,通过appid 去缓存里获取相关的accesstoken,但是这种方式改动起来的工作量会比较大。

  2. 还有一种我想到的是,再调用接口方法前去维护一下accesstoken, 获取accesstoken或者判断是否过期去刷新token,然后当token确定有效时,调用接口前再 ApiConfigKit.setCurrentAppId(appId)设置token,但是在接口里面,使用同步的方式去 getAccessToken,这样因为node 的单线程,只要中间没有异步,应该就不会发生错乱的现象。

这两个仅仅是我目前的想法,也希望能有更多的好的处理方法。

GavinSun09 avatar May 07 '20 02:05 GavinSun09

之前就是使用的第二种方案,但有同学反馈 getAccessToken setAccessToken 建议设置为异步后面就改了,调用接口获取时加了 await 相当于也是同步。node 单线程,目前测试还没有发现错乱的问题。 如果还有问题请继续反馈。

Javen205 avatar May 10 '20 07:05 Javen205

是不是apiConfig的kit和accesstoken的获取做成扩展或插件更好,由使用者自己维护逻辑,官方的作为默认,现在的话如果有自己逻辑得修改源代码

zjsxfly avatar Feb 26 '21 08:02 zjsxfly

@Javen205 你好,ApiConfigKit 是否开放给使用者自己new呢,这样小程序、公众号等多应用开发时可以根据不同的kit进行调用。而不是在调用api前先ApiConfigKit.setCurrentAppId(appId)

heibai01 avatar Jan 10 '22 10:01 heibai01

这个都是静态方法调用,在多应用模式下会存在问题

cmzz avatar Jul 17 '23 12:07 cmzz

野方法,把currentAppId的存储从全局偷换到异步上下文

以QyApiConfigKit为例,服务启动前调用下

import { QyApiConfigKit } from 'tnwx';
import { AsyncLocalStorage } from 'node:async_hooks';

const enhanceAsyncStorage = () => {
  const asyncLocalStorage = new AsyncLocalStorage();

  QyApiConfigKit.setCurrentAppId = (appId, corpId) => {
    const currentAppId = appId.concat(QyApiConfigKit.SEPARATOR).concat(corpId);
    const store = { currentAppId: currentAppId };
    asyncLocalStorage.enterWith(store);
  };

  QyApiConfigKit.removeCurrentAppId = () => {
    asyncLocalStorage.getStore()['currentAppId'] = '';
  };

  Object.defineProperty(QyApiConfigKit, 'currentAppId', {
    get() {
      return asyncLocalStorage.getStore()['currentAppId'];
    },
  });
};

magicxie avatar Aug 02 '23 09:08 magicxie