存储临时变量以在Loopback 4应用程序中使用

问题描述 投票:2回答:1

我有一个我想在多个Loopback 4控制器中使用的身份验证令牌。此令牌过期。一旦过期,我运行一些登录逻辑来获取新令牌。

我的问题是我不确定如何或在哪里存储此令牌。

所以我可以在我的应用程序中使用它,我想要将令牌保存为环境变量,例如。

process.env.AUTH_TOKEN = 'TEST';

或使用Loopback 4的应用程序级上下文https://loopback.io/doc/en/lb4/Context.html

这些令牌是否适合存储此令牌?如果不是什么可以替代解决方案?

在使用Context的情况下,我将如何使用最佳实践来执行此操作?

loopbackjs loopback
1个回答
1
投票

考虑到上述所有注释,我建议您创建一个单独的模块,该模块将封装与您的身份验证令牌相关的逻辑以及您如何使用它。即新模块将负责:

  • 在空标记时获取新标记
  • 存储令牌
  • 令牌过期后刷新令牌
  • 执行API调用(或者您使用该令牌执行的任何操作,对不起,您的描述都不清楚) - 可以移动到单独的模块,但这是一个不同的故事

我想你的JavaScript模块可能看起来像:

let AUTH_TOKEN = "";

function makeAPICall(some, params) {
    if (! AUTH_TOKEN) {
        acquireNewToken();
    }

    if (expired()) {
        refreshToken();
    }

    return "some_data"; // TODO: here you do you what you want with your auth token and return some data
}

function acquireNewToken() {
    authToken = "new_token"; // TODO: put the logic to acquire a new token here
}

function refreshToken() {
    authToken = "new_token"; // TODO: put the logic to refresh a token here
}

function expired() {
    return false; // TODO: put the logic to check if token expired here
}

module.exports = {
    makeAPICall: makeAPICall
};

然后你可以在所有控制器中使用require authModule并使用它如下:

let authModule = require('./modules/authModule');

authModule.makeAPICall("some", "params");

我相信您永远不需要将auth令牌暴露给您的控制器,因为您可以在authModule中实现与auth令牌使用相关的所有逻辑,并且只将一些参数传递给makeAPICall函数以告诉它要做什么以及要获取哪些数据。但是如果你真的需要暴露它,你可以稍微更改authModule(添加getToken函数并将其添加到module.exports):

function getToken() {
    return authToken;
}

module.exports = {
    makeAPICall: makeAPICall,
    getToken: getToken
};

现在,让我们回到你的问题:

这些令牌是否适合存储此令牌?如果不是什么可以替代解决方案?

如上所述,解决方案是将令牌存储为自定义模块范围内的局部变量。请注意,作为Node.js uses caching for modules,您的AUTH_TOKEN变量在所有控制器中都是相同的(每个新的require将使用相同的标记返回完全相同的对象)。

如果你不想在每次需要访问requireauthModule AUTH_TOKEN,你也可以简单地将它声明为全局变量:global.AUTH_TOKEN = "";。请注意,全局变量有它的缺点,因为它可能导致文件之间的隐式耦合等。这是一篇很好的文章,关于何时应该以及何时不应该使用全局变量:https://stackabuse.com/using-global-variables-in-node-js/

在使用Context的情况下,我将如何使用最佳实践来执行此操作?

您也可以使用Loopback 4 Context,它几乎等同于我在上面提出的自定义authModule的解决方案。与客户模块的唯一区别 - 您可以在那里放置更多的自定义逻辑,并避免在控制器中复制粘贴一些代码。使用Loopback 4 Context,您可以使用服务器级上下文并在那里存储AUTH_TOKEN,但是您仍然需要一些获得新令牌的地方,并在它到期时刷新它。同样,您可以在自定义authModule中实现此逻辑。即您仍然可以保留该自定义模块并同时将AUTH_TOKEN存储在Loopback Context中。这绝对可以,但从我的角度来看,它会使代码更复杂一些。

© www.soinside.com 2019 - 2024. All rights reserved.