如何从过期的 Kuzzle 令牌服务器端恢复?
How do I recover from an expired Kuzzle token server side?
我在管理来自 Kuzzle javascript SDK 的授权控制器的 jwt 令牌时遇到问题。我是 JS 或 Kuzzle 的完全初学者,对于任何错误的假设感到抱歉。
我在我的 Express 服务器上使用一个简单的管理员帐户,有权注册和更新用户,或创建 indices/collections。这是到目前为止的设置。
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}
三个问题:
"invalid" 是预期的行为吗? 我想我成功登录了,并且 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
.
首先回答 2 个问题:
- "invalid" 是预期的行为吗? (对于过期的令牌) :不,它
即将修复
- 为什么 Kuzzle 将我注销为无效令牌?:无效令牌无法授予权限,因此 Kuzzle returns 出错
如何从过期的令牌中恢复
您可能想要做的第一件事是以第一种方式防止令牌过期。
您可以使用 auth:refreshToken, use auth:login with a higher expiration time or use 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 javascript SDK 的授权控制器的 jwt 令牌时遇到问题。我是 JS 或 Kuzzle 的完全初学者,对于任何错误的假设感到抱歉。
我在我的 Express 服务器上使用一个简单的管理员帐户,有权注册和更新用户,或创建 indices/collections。这是到目前为止的设置。
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}
三个问题:
"invalid" 是预期的行为吗? 我想我成功登录了,并且 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
.
首先回答 2 个问题:
- "invalid" 是预期的行为吗? (对于过期的令牌) :不,它 即将修复
- 为什么 Kuzzle 将我注销为无效令牌?:无效令牌无法授予权限,因此 Kuzzle returns 出错
如何从过期的令牌中恢复
您可能想要做的第一件事是以第一种方式防止令牌过期。
您可以使用 auth:refreshToken, use auth:login with a higher expiration time or use 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