我在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
从安全错误代码a期望时,我得到一个错误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通知,并且不会为此订阅发送其他任何进一步的通知。
SDK会收到通知,发出tokenExpired事件,并将SDK实例身份验证令牌设置为,null
因为它无法再使用它。
这就是为什么security.rights.forbidden
在后续呼叫中收到错误的原因,因为您没有任何身份验证令牌,因此Kuzzle为您提供了匿名用户权限。
当您使用过期的身份验证令牌时,应该收到security.token.expired
错误消息。其实有个错误,所以您只会收到security.token.invalid
。
要回答两个第一个问题:
如何从过期的令牌中恢复
您可能要做的第一件事就是从第一方面防止令牌到期。
您可以使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句