我有一个我想在多个Loopback 4控制器中使用的身份验证令牌。此令牌过期。一旦过期,我运行一些登录逻辑来获取新令牌。
我的问题是我不确定如何或在哪里存储此令牌。
所以我可以在我的应用程序中使用它,我想要将令牌保存为环境变量,例如。
process.env.AUTH_TOKEN = 'TEST';
或使用Loopback 4的应用程序级上下文https://loopback.io/doc/en/lb4/Context.html
这些令牌是否适合存储此令牌?如果不是什么可以替代解决方案?
在使用Context的情况下,我将如何使用最佳实践来执行此操作?
考虑到上述所有注释,我建议您创建一个单独的模块,该模块将封装与您的身份验证令牌相关的逻辑以及您如何使用它。即新模块将负责:
我想你的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
将使用相同的标记返回完全相同的对象)。
如果你不想在每次需要访问require
时authModule
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中。这绝对可以,但从我的角度来看,它会使代码更复杂一些。