我有一个身份验证令牌,我想在多个Loopback 4控制器中使用。该令牌到期。过期后,我将运行一些登录逻辑以获取新令牌。
我的问题是我不确定如何或在何处存储此令牌。
所以我可以在我的整个应用程序中使用它,我正在考虑将令牌另存为环境变量,例如。
process.env.AUTH_TOKEN = 'TEST';
或使用Loopback 4的应用程序级别上下文 https://loopback.io/doc/en/lb4/Context.html
这些存储令牌的合适解决方案吗?如果不是,那将是替代解决方案?
在使用上下文的情况下,我将如何使用最佳实践来做到这一点?
答案 0 :(得分:1)
考虑到以上所有评论,我建议您创建一个单独的模块,该模块将封装与身份验证令牌及其使用方式有关的逻辑。即一个新的模块将负责:
我想您的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/
在使用上下文的情况下,我将如何使用 最佳做法?
您也可以使用Loopback 4 Context,它几乎与上面我建议的自定义authModule
等效。客户模块的唯一区别-您可以在其中添加更多自定义逻辑,并避免将某些代码复制粘贴到控制器中。使用Loopback 4上下文,您可以使用服务器级别的上下文并将AUTH_TOKEN
存储在此处,但是您仍然需要一些地方来获取新令牌并在令牌过期时对其进行刷新。同样,您可以在自定义authModule
中实现此逻辑。即您仍然可以保留该自定义模块,并将AUTH_TOKEN
同时存储在Loopback Context中。绝对可以,但是从我的角度来看,这会使代码更加复杂。