如何在页面重新加载期间保留 class 个 javascript sdk 实例

How to preserve class instance of a javascript sdk during page reload

我创建了一个 Javascript 与我的后端交互的 SDK 层 API。

在前端,我通过以下方式实例化所述 sdk:

// my-sdk-js.js
class MySDK() {
  constructor() {
    this.accessToken = null;
  }
  authenticate(payload) {
    const { email, tripid } = payload;
    // fetch token from backend using email + tripid => response
    this.accessToken = response.token
  }
  getData() {
    // fetch data from backend using this.accessToken => response
    return response.data; // array of data
  }
  ...
}

import mySDK from 'my-sdk-js';

const mySdk = new mySDK();
mySDk.authenticate({
  email: 'myemail@gmail.com',
  tripid: '1234567890'
}) // internally fetches jwt token and saves it as a variable to that instance of mySDK
mySDK.getData().then(response => console.log(response.data)) // array of data

然而想象一下我将这个 sdk 保存到全局状态管理 (redux/vuex),我可以将这个实例传递给我喜欢的任何组件。在组件中,我可以调用该 SDK 的方法。但是由于每个端点调用都需要一个令牌,因此当我丢失令牌(从页面刷新)时,我无法使用 class 方法。我的做法是否正确?

最终目标是拥有一个与我的后端交互的 sdk 层 api,而前端只需要使用这个 sdk 并使用它的方法,抽象出端点。我正在通过电子邮件身份验证检索 jwt 令牌,然后将此令牌保存到 mySDK 实例上的一个变量中。我也试过将此令牌保存到 localStorage,但我读过它不太安全。

我见过像 dropbox 这样的 sdk,它们在一个地方实例化它,并在一个文件中使用它的方法。但是,如果我需要在 React 或 Vue 应用程序的不同组件中使用 class 方法怎么办?

您可以将令牌保存在 localStorage 或您选择的持久性存储中。将令牌保存在存储或 cookie 中是保留身份验证的唯一方法,因为所有 javascript 实例引用在页面重新加载时都会被销毁。如前所述,它容易受到 XSS 攻击(例如来自 CDN 的恶意代码),但您需要密切关注导入的依赖项。

// sdk file
class mySDK {
  constructor(token) {
    // pass token from vuex/redux
    this.accessToken = token;
  }
  authenticate(payload) {
    const { email, tripid } = payload;
    // fetch token from backend using email + tripid => response
    this.accessToken = response.token;
    // save returned token in vuex/redux
    return this.accessToken;
  }
  getData() {
    // fetch data from backend using this.accessToken => response
    return response.data; // array of data
  }
}

export default mySDK;

clientsingleton.js

// clientsingleton.js helper file
import mySDK from 'my-sdk-js';

// use localstorage oder statemanagement of your choice
export default new mySDK(localStorage.getItem('SAVED_TOKEN'));

main.js

// in main.js file
import mySDK from './clientsingleton.js';

mySDK
  .authenticate({
    email: 'myemail@gmail.com',
    tripid: '1234567890',
  })
  .then((token) => localStorage.setItem('SAVED_TOKEN', token)); // internally fetches jwt token and saves it as a   variable to that instance of mySDK

每隔一个文件

// in every other file where you need to use your sdk
import mySDK from './clientsingleton.js';

mySDK.getData().then((response) => console.log(response.data)); // array of data