如何为StrongLoop API创建永久访问令牌。现在,对于每个用户登录,它创建一个访问令牌。我的数据库中有不必要的条目
我可以像here那样提高访问令牌(ttl)的有效性。
但它仍会为新登录生成。
答案 0 :(得分:7)
你混合了两件不同的东西。 AccessToken条目创建和AccessToken的ttl值。
当用户登录时,会创建一个新的AccessToken。如果用户注销,则删除AccessToken。如果用户登录2次,例如从2个不同的设备登录,那么您将获得2个AccessTokens,这样用户就可以同时从2个设备访问您的应用程序。
如果用户想要从同一设备登录并且他已经拥有有效令牌,那么您的应用应该会识别并自动登录。
显然,如果ttl值已过期,则令牌将不再有效。如果尝试使用此标记,则会删除此标记。我想如果你不想在你的数据库中记录这些记录,你可以创建一个删除过期令牌的自定义cron作业。
关于永久访问令牌,它需要禁用ttl值,而目前暂时无法访问默认的AccessToken模型。我创建了一个pull request to support that,如果您感兴趣,可以插入并查看它是否合并。
答案 1 :(得分:6)
Loopback有一个选项,允许您创建永久访问令牌:
allowEternalTokens
布尔允许访问永不过期的令牌。
https://loopback.io/doc/en/lb3/Model-definition-JSON-file.html#advanced-options
这就是我的所作所为:
为用户模型启用allowEternalTokens
在server / model-config.json中:
"User": {
"dataSource": "db",
"options": {
"validateUpsert": true,
"allowEternalTokens": true
}
},
登录时,请将ttl
设置为-1
User.login(
{
email: email,
password: password,
ttl: -1,
},
正如您已经想到的那样,每次登录时都会创建一个新的(不同的)访问令牌。因此,如果要重用相同的访问令牌,请仅登录一次。您可以从AccessToken模型(或直接从数据库)获取访问令牌
AccessToken.findOne(
{
where: {
userId: userId,
},
},
如果您有自定义用户模型,则可以直接在模型定义文件中设置allowEternalTokens
。此外,如果您有自定义用户模型,则还需要更新AccessToken模型的relations
(如果有的话,可以更新内置的模型或自定义模型)以指向自定义用户模型
有关自定义用户/访问令牌模型的更多信息,请访问:http://loopback.io/doc/en/lb3/Authentication-authorization-and-permissions.html#preparing-access-control-models