最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何从过期的Kuzzle令牌服务器端恢复?

网站源码admin16浏览0评论

如何从过期的Kuzzle令牌服务器端恢复?

如何从过期的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

要回答两个第一个问题:

  1. 预期的行为“无效”吗? (用于过期的令牌):不,它即将修复
  2. 为什么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
发布评论

评论列表(0)

  1. 暂无评论