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

ChoKaPeek

我在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.forbiddenID。

// 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

要回答两个第一个问题:

  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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何验证 Facebook 用户令牌服务器端

尝试在服务器端验证华为订阅时出现“令牌已过期或无效”

InApp订阅已过期,如何检查服务器端

应用内购买:恢复购买服务器端

使用Apple登录:在服务器端验证令牌

如何使用Firebase身份验证在服务器端检索刷新令牌?

如何在服务器端处理新的刷新令牌?

如何在节点JS的服务器端验证Google身份验证令牌?

如何从blazor(服务器端)Web应用程序获取访问令牌?

CSRF Guard-如何在服务器端验证生成的令牌

如何调和Firebase Auth令牌与服务器端渲染的刷新

授权google OAuth 2.0在服务器端,如何检查令牌?

如何将承载令牌存储在Web API 2的服务器端?

Facebook API中的服务器端访问令牌与客户端访问令牌

服务器端C#Websocket,如何在侦听取消令牌时运行循环?

如何在服务器端(Node.js)上以编程方式验证Facebook用户的访问令牌?

如何从此Android应用程序获取此Google登录ID令牌以验证服务器端?

JSW令牌服务器端(laravel)和/或客户端(角度2)?

刷新令牌-服务器端存储和多个客户端的吊销

用令牌认证客户端和服务器端的正确方法?

从服务器端向客户端发送jwt令牌的正确方法是什么?

客户端或服务器端生成 PAYFORT 令牌?

如何模拟服务器响应-服务器端客户端

如何从服务器端的jQuery Ajax检索“数据”?

如何在服务器端更改字体?

如何从网站获取文本-服务器端

如何设置服务器端预接收钩子?

如何使用MySQL管理服务器端进程

如何在服务器端使用JSON Sanitizer?