令牌服务器端恢复?"/>
如何从过期的Kuzzle令牌服务器端恢复?
我在Kuzzle javascript SDK的身份验证控制器中管理jwt令牌时遇到问题。我是JS或Kuzzle的完整初学者,对任何错误的假设表示歉意。
我在Express服务器上使用一个简单的管理员帐户,该帐户具有注册和更新用户或创建索引/集合的权利。这是到目前为止的设置。
const {Kuzzle, WebSocket} = require('kuzzle-sdk')
const config = require('../config/config')
const kuzzle = new Kuzzle(new WebSocket('localhost'))
// Add a listener to detect connection problems
kuzzle.on('networkError', (error) => console.error("Network Error: " + error))
// start admin session
if (!kuzzle.connected) {
kuzzle.connect()
.then(() => kuzzle.auth.login('local', {username: config.kuzzle, password: config.kuzzle.password}))
.catch((error) => {
console.error(error)
kuzzle.disconnect()
})
}
在令牌到期时,当我期望从security.token.invalid
获得security error codes时,出现security.token.expired
错误。然后,以下所有请求均失败,并带有security.rights.forbidden
ID。
// token not expired
await kuzzle.auth.getCurrentUser()
.then((user) => console.log(user.content)) // { profileIds: [ 'admin' ], _kuzzle_info: {...} }
.catch((err) => console.error(err)) // X
// token just expired
await kuzzle.auth.getCurrentUser()
.then((user) => console.log(user.content)) // X
.catch((err) => console.error(err)) // [KuzzleError: Invalid token.] {status: 401, id: 'security.token.invalid', code: 117506049}
// following user
await kuzzle.auth.getCurrentUser()
.then((user) => console.log(user.content)) // { profileIds: [ 'anonymous' ], name: 'Anonymous' }
.catch((err) => console.error(err)) // X
// any following request (admin does have those permissions)
await kuzzle.index.exists("existing")
.catch((err) => console.error(err)) // [KuzzleError: Insufficient permissions to execute the action "index:exists".] {status: 403, id: 'security.rights.forbidden', code: 117637122}
三个问题:
“预期的行为是否“无效”?我认为我已成功登录,并且Kuzzle不会在到期日期前抛出,因此我希望令牌已过期且不是无效。我尝试使用5秒或2小时的令牌获得了相同的结果。
为什么Kuzzle登出我以获取无效的令牌?并不是我在抱怨,只是出于好奇。
并且我如何从Kuzzle中过期的令牌中恢复?是否有良好的做法?或更妙的是,在注销之前,我可以在服务器有效期内自动刷新令牌吗?
我目前的快速而又肮脏的解决方案是使用错误处理程序Express中间件来拦截错误(如果它是kuzzle-sdk/src/KuzzleError.js的实例,请检查这两个错误ID中的任何一个,然后重新登录)。然后,我将重做查询的任务留给客户端,这有点麻烦。
我正在使用Kuzzle-SDK v7.1.4。
非常感谢!
回答如下:这里是Kuzzle开发人员。
[我看到您正在使用Javascript SDK,因此行为与直接使用API略有不同。
首先,当您订阅实时通知时,Kuzzle会定期检查与订阅关联的令牌是否仍然有效。
如果令牌已过期,则Kuzzle发送TokenExpired notification,并且将不发送任何其他有关此订阅的通知。
SDK接收到通知,发出tokenExpired事件,并将SDK实例身份验证令牌设置为null
,因为它不再可以使用它。
这就是为什么在随后的呼叫中收到security.rights.forbidden
错误的原因,因为您没有任何身份验证令牌,因此Kuzzle为您提供了匿名用户权限。
当您使用过期的身份验证令牌时,应该收到security.token.expired
错误。实际上存在一个错误,因此您只会收到security.token.invalid
。
要回答两个第一个问题:
- 预期的行为“无效”吗? (用于过期的令牌):不,它即将修复
- 为什么Kuzzle登出我以获取无效令牌?:无效令牌无法授予权限,因此Kuzzle返回错误
如何从过期的令牌中恢复
您可能要做的第一件事是从第一方面防止令牌到期。
您可以使用auth:refreshToken,使用具有更长到期时间的auth:login或使用auth:createApiKey生成永不过期的API密钥。
如果您由于到期而必须从过期的令牌中恢复,则必须使用auth:login重新登录。
kuzzle.on('tokenExpired', () => kuzzle.auth.login(...));
在您的用例中(在后端应用程序中使用SDK),我建议您使用API密钥进行身份验证而不会过期。
kuzzle.jwt = <api-key>
// further request will be authenticated with the API key user
更多推荐
如何从过期的Kuzzle令牌服务器端恢复?
发布评论