Как мне восстановиться после истекшего токена на стороне сервера Kuzzle? - PullRequest
2 голосов
/ 08 мая 2020

У меня проблема с управлением токеном jwt из контроллера авторизации Kuzzle javascript SDK. Я полный новичок в 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.

// 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? Есть ли хорошая практика для этого? Или, что еще лучше, могу ли я автоматически обновлять sh токен до тех пор, пока сервер жив, до выхода из системы?

Мое быстрое и грязное решение на данный момент - использовать ошибку обработчик Express промежуточного программного обеспечения для перехвата ошибки, если это экземпляр kuzzle-sdk / src / KuzzleError. js, проверьте любой из этих двух идентификаторов ошибок и повторно войдите в систему. Затем я оставляю свою клиентскую часть с задачей повторить запрос, что немного неудобно.

Я использую kuzzle-sdk v7.1.4.

Большое спасибо!

1 Ответ

1 голос
/ 14 мая 2020

Разработчик Kuzzle здесь.

Я вижу, что вы используете Javascript SDK, поэтому поведение немного отличается от использования напрямую API.

Сначала , когда вы подписываетесь на уведомления в реальном времени, Kuzzle периодически проверяет, действителен ли токен, связанный с подпиской.

Если срок действия токена истек, Kuzzle отправляет уведомление TokenExpired и не будет отправлять никаких других уведомлений для этой подписки.

SDK получит уведомление, отправит tokenExpired , а также установите для токена аутентификации экземпляра SDK значение null, поскольку он больше не может его использовать.

Вот почему вы получаете ошибку security.rights.forbidden в последующих вызовах, потому что вы этого не делаете иметь какой-либо токен аутентификации, поэтому Kuzzle предоставит вам права анонимного пользователя.

Когда вы используете просроченный токен аутентификации, вы должны получить сообщение об ошибке security.token.expired. На самом деле есть ошибка, поэтому вы получаете только security.token.invalid.

Чтобы ответить на 2 первых вопроса:

  1. Является ли "недействительным" ожидаемое поведение? (для токенов с истекшим сроком действия) : Нет, это скоро будет исправлено
  2. Почему Kuzzle выводит меня из системы из-за недействительного токена? : Недействительный токен не может предоставить права, поэтому Kuzzle возвращает error

Как восстановить истекший токен

Первое, что вы можете сделать, это предотвратить истечение срока действия токена первым способом.

Вы можете использовать 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
...