gpt4 book ai didi

javascript - 如何从过期的 Kuzzle token 服务器端恢复?

转载 作者:行者123 更新时间:2023-12-04 10:04:10 25 4
gpt4 key购买 nike

我在管理 Kuzzle javascript SDK 的身份验证 Controller 中的 jwt token 时遇到问题。我是 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()
})
}

在 token 到期时,我收到 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 在到期日期之前没有抛出,所以我期望一个过期而不是无效的 token 。我尝试了 5 秒或 2 小时的 token ,结果相同。
  • 为什么 Kuzzle 会因为无效的 token 将我注销? 不是我在提示,只是好奇。
  • 如何从 Kuzzle 中的过期 token 中恢复? 有没有这样做的好习惯?或者更好的是,在注销之前,我可以在服务器存在期间自动刷新 token 吗?

  • 我现在快速而肮脏的解决方案是使用错误处理程序 Express 中间件来拦截错误,如果它是 kuzzle-sdk/src/KuzzleError.js 的实例的话。 , 检查这两个错误 ID 中的任何一个,然后重新登录。然后我将重试查询的任务留给我的客户端,这有点难以处理。

    我正在使用 kuzzle-sdk v7.1.4。

    非常感谢!

    最佳答案

    Kuzzle 开发人员在这里。

    我看到您正在使用 Javascript SDK,因此行为与直接使用 API 略有不同。

    首先,当您订阅实时通知时,Kuzzle 会定期检查与订阅关联的 token 是否仍然有效。

    如果 token 已过期,则 Kuzzle 发送 TokenExpired notification并且不会就此订阅发送任何其他进一步通知。

    SDK 收到通知,发出 tokenExpired事件,并将 SDK 实例身份验证 token 设置为 null因为它不能再使用它了。

    这就是为什么您会收到 security.rights.forbidden在后续调用中出错,因为您没有任何身份验证 token ,因此 Kuzzle 为您提供匿名用户权限。

    当您使用过期的身份验证 token 时,您应该收到 security.token.expired错误。实际上有一个错误所以你只收到security.token.invalid .

    首先回答两个问题:

  • “无效”是预期的行为吗? (对于过期的 token ):不,它
    即将修复
  • 为什么 Kuzzle 因无效 token 而将我注销?:无效 token 无法授予权限,因此 Kuzzle 返回错误

  • 如何从过期的 token 中恢复

    您可能想要做的第一件事是以第一种方式防止 token 过期。

    您可以使用 auth:refreshToken , 使用 auth:login使用更长的到期时间或使用 auth:createApiKey生成永不过期的 API key 。

    如果您因为到了过期时间而不得不从过期的 token 中恢复,那么您必须再次使用 auth:login 登录。 .
    kuzzle.on('tokenExpired', () => kuzzle.auth.login(...));

    在您的用例中(在后端应用程序中使用 SDK),我建议您使用 API key 进行身份验证而不会过期。
    kuzzle.jwt = <api-key>
    // further request will be authenticated with the API key user

    关于javascript - 如何从过期的 Kuzzle token 服务器端恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61669480/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com