Сомнения по поводу Json веб-токена и контроля сессий пользователей - PullRequest
0 голосов
/ 07 августа 2020

Ну, я только что прошел базовый курс c Backend-разработки с Nodejs, и можно сказать, что я новичок в мире веб-разработки. В одном из модулей курса я узнал, как защитить свои внутренние маршруты с помощью Json веб-токенов, и теперь я начинаю разрабатывать базовый c чат, используя reactjs для внешней стороны и Nodejs для разработки. мой бэкэнд. Но теперь, когда я думаю о безопасности страницы, мне приходит в голову множество вопросов, которые не были объяснены в курсе. Я планировал проверить доступ пользователя к маршрутам страницы с логином, отправляющим JWT. Поэтому, учитывая этот факт, у меня следующие вопросы:

  1. Как получить токен из внешнего интерфейса?

Курс, который я прошел, был полностью сосредоточен на серверной части, поэтому я работал с почтальоном, отправляющим запросы и хранящим данные об ответах в переменных среды. Поэтому я не знаю, как получить токен из внешнего интерфейса (я не знаю, могу ли я получить его с любой стороны кеш-хранилища, или мне нужно сохранить его в базе данных или что-то в этом роде).

Как отозвать токен?

Ну, я знаю, что могу указать время истечения срока действия токена, но в этом случае я не хочу, чтобы он истекал, если пользователь не выйдет из системы страница. Я читал на некоторых сайтах, что невозможно удалить его так просто, но они рекомендуют удалить токен со стороны клиента и со стороны сервера, сохранив токен в запрещенном списке, который содержит токены, срок действия которых не истек. но они больше не доступны.

Последний вопрос, как обновить sh jwt?

Ну, я не знаю, правильно ли был сформулирован вопрос, но вот он, и я думаю, что он связан с второй. Представьте, что я не хочу, чтобы токен длился вечно, вместо этого я хочу, чтобы срок действия токена истекал через одну неделю, если пользователь не входит в течение всей недели, но как только пользователь входит, срок действия обновляется. Короче говоря, я хочу, чтобы пользователь мог оставаться в журнале, если он не заходит на страницу в течение одной недели. Что было бы наиболее практичным?

Не говоря уже о том, спасибо за чтение, и я был бы признателен за любые подсказки или примеры кода, которые помогут вам разрешить мои вопросы. Спасибо.

1 Ответ

1 голос
/ 07 августа 2020

Как получить токен из фронтенда? Токен должен быть отправлен как часть REST API, header. Есть много способов отправить токен, но наиболее подходящим является установка заголовка носителя авторизации.

Подробнее об авторизации здесь

например:

  headers: req.headers.set('Authorization', 'Bearer ' + authToken)

В NodeJS, если вы используете express, вы можете написать промежуточное ПО для извлечения токена:

    const jwt = require('jsonwebtoken');
    module.exports = (req, res, next) => {
      try {
        const token = req.headers.authorization.split(' ')[1];
        jwt.verify(token, "your_token_secret");
        next();
      } catch (error) {
          res.status(401).json({
            message: 'Invalid Token'
          });
      }
    };

Как отозвать токен?

В вашем внешнем приложении сохраните токен в localStorage на желаемое количество времени, и при загрузке приложения проверьте токен localStorage, если он есть и срок его действия не истек, авторизуйтесь еще раз, запросите вход снова, что сгенерирует новый токен, что-то вроде:

        onAppLoad() {
             saveAuthData(token_from_backend, date_from_backend);
        }
    
    saveAuthData(token: string, expirationDate: Date) {
        localStorage.setItem('token', token);
        localStorage.setItem('expiration', expirationDate.toISOString());
      }
    
        clearAuthData() {
            localStorage.removeItem('token');
            localStorage.removeItem('expiration');
        }
    
        getAuthData() {
            const token = localStorage.getItem('token');
            const expiration = localStorage.getItem('expiration');
            if (!token || !expiration) {
              return;
            }
            return {
              token: token,
              expirationDate: new Date(expiration)
            };
          }

Вы также можете автоматически входить в систему без запроса учетных данных, если токен действителен.

    autoAuthUser() {
          const authInformation = getAuthData();
          const now = new Date();
          const expiresIn = authInformation.expirationDate.getTime() - now.getTime();
          if (expiresIn > 0) {
            token = authInformation.token;
            isAuthenticated = true;
            setAuthTimer(expiresIn / 1000);
           
          }
      }

Установка таймера для отзыва токена, для этого mu sh время, когда токен должен присутствовать в localStorage после этого удалите его или замените обновленным токеном

setAuthTimer(duration: number) {
   tokenTimer = setTimeout(() => {
      this.logout();
    }, duration * 1000);
  }
...