Jwt (json web token) автоматическое продление срока действия

Что такое аутентификация на основе токенов?

Одним из многочисленных методов, используемых веб-пользователями для обеспечения безопасности процесса проверки, является аутентификация на основе маркеров. Биометрия и аутентификация по паролю – это тоже варианты. Если различать каждую технику аутентификации, то их можно разделить на три группы:

  1. Аутентификация по паролю (обычная комбинация символов)
  2. Биометрическая аутентификация (отпечаток пальца, сканирование сетчатки глаза, FaceID)
  3. Аутентификация по токенам.

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

Злоумышленникам придется преодолеть уровень аутентификации токенов, если они решат применить силу для получения пароля. Вы не сможете получить доступ к сети, если у вас нет доступа к маркерам. Благодаря этому дополнительному уровню сети защищены от потенциально катастрофических взломов.

Что такое json веб-токены?

Открытый стандарт RFC 7519 под названием JSON Web Token (JWT) описывает сжатый и самодостаточный метод передачи данных между сторонами в виде объекта jSon. С помощью цифровой подписи это может быть подтверждено. Используя алгоритмы RSA или ECDS, JWT может быть подписан с секретом.

Веб-токены JSON состоят из трех компонентов: заголовка, полезной нагрузки и подписи при сжатии. Таким образом, JWT обычно выглядит следующим образом: “x x X, yyu.zz”.

В тексте указывается используемый алгоритм подписи (например, HMAC SHA256 или RSA), а также тип токена – JWT.

Полезная нагрузка, составляющая второй компонент токена, содержит данные пользователя и любую дополнительную информацию, которая требуется. Эти данные могут быть общедоступными, частными или зарегистрированными.

Для повышения безопасности рекомендуется использовать дополнительный набор ключей, называемый регистрацией. Например, Exp – время UNIX для определения момента неиспользования; или iss – уникальный идентификатор стороны в формате Unix Time (определяющий момент истечения срока действия токена).

Похожее:  Гугл Класс вход: как попасть в свой аккаунт, регистрация и сколько стоит использование

Те, кто использует JWT, могут определять публичную информацию по своему усмотрению. Однако они должны быть внесены в реестр веб-маркеров IANA JSON или иметь URI, содержащий устойчивое к коллизиям пространство имен для их идентификации. Частная информация является обычной и используется для обмена данными между сторонами без учета того, кто является сторонами этой информации. Используйте кодировку Base64Url для быстрого перехода к следующему разделу.

Я был так же озадачен тем, что там происходило.

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

Почему стоит использовать токены авторизации?

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

Для системных администраторов, которые часто предоставляют временный доступ на основе даты или времени, они полезны. Люди испытывают серьезное напряжение, когда доступ многократно предоставляется и отзывается.

Рекомендации по аутентификации на основе токенов

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

Безопасно ли использование токенов?

Мы должны усовершенствовать наши политики и процедуры для защиты в будущем. За последние несколько лет участились случаи использования атак “грубой силы”, перебора по словарю и фишинга для получения учетных данных пользователей.

В сочетании с другими методами аутентификации аутентификация на основе токенов создает барьер 2FA. Системы аутентификации на основе маркеров отличаются высокой эффективностью и безопасностью.

Но несмотря на все преимущества использования платформы токенов и низкий риск. Токены на базе смартфонов могут быть небезопасны, но у них есть недостатки безопасности. Отправлять токены в виде текстовых сообщений менее опасно, поскольку их можно перехватить в пути.

В случае кражи access токена, refresh куки и fingerprint’а:

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

Я предложу несколько исправлений этой проблемы.

  1. Хакер использует маркер доступа
  2. Маркер доступа просрочен
  3. Хакер посылает обновленный cookie и отпечаток пальца
  4. Сервер проверяет IP хакера, хакер отправляется в лес.

Зачем все это ? jwt vs cookie sessions

К чему вся эта суета? Почему традиционные сессии с куки не удаются? Почему файлы cookie являются проблемой?

Имплементация:

Front-end:

Back-end:

Как определить, истек ли токен oauth?

Вопрос:

Я использую протокол OAuth 2.0 в своем мобильном приложении. Поля update token и expires_in включены в маркер доступа OAuth. У меня есть время expires_in и маркер обновления, сохраненные в моем приложении, но я не уверен, когда их использовать.

  • Итак, какова обычная и лучшая практика использования этого expires_in?
  • Как определить, что срок действия моего маркера доступа истек?
  • Существует ли общий формат ошибки веб-службы, который указывает на то, что срок действия моего маркера доступа истек?

Лучший ответ:

Опубликована информация о обновлении токена OAuth 2.0

Исходит в определении

Поле expires_in определяется стандартом OAuth 2.0, RFC 6749, как продолжительность в секундах до истечения срока:

Рекомендация: Expires in. время жизни маркера доступа в секундах. Например, значение “3600” означает, что срок действия маркера доступа истечет через час после создания ответа. Сервер авторизации ДОЛЖЕН предоставить время истечения срока действия, если оно не указано, или же он ДОЛЖЕН письменно указать значение по умолчанию.

Обработка обновления токена методом 1

Клиенты могут обработать это, сохраняя время истечения срока действия при каждом запросе к своему адресу после получения действительного значения access_token, expires_in и т.д. Чтобы сделать это, вы должны предпринять следующие действия:

  1. Конвертировать expires_in в время истечения (эпоха, время expires_in RFC-3339/ISO-8601 и т.д.)
  2. Хранить время истечения
  3. Для каждого запроса ресурса access_token объединять текущее время с временем истечения и делать запрос на обновление токена до запроса ресурса, если срок действия access_token истек

В этом примере значение expires_in преобразуется в дату-время RFC 3339 с помощью библиотеки Go oauth2. Стандарт OAuth 2.0 не определяет срок действия, но в данной ситуации он уместен.

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

Вы получаете новый токен refresh с будущей датой истечения срока действия в дополнение к новому токену доступа (access_token). Если вы получили один из этих маркеров, сохраните новый refresh_token, чтобы дольше сохранить активность вашей сессии.

Обработка обновления токенов методом 2:

После получения ошибки о недопустимости еще одним способом обработки обновления токена является ручное обновление. Вы можете поэкспериментировать самостоятельно или использовать предыдущую стратегию.

Вам следует запустить обновление токена, если у вас возникла ошибка токена и вы используете токен доступа с истекшим сроком действия. Учитывая, что различные службы могут использовать различные имена ошибок для ошибок 4xx в одном и том же файле, а также различные коды ошибок для просроченных токенов, просто проверить одно обновление для каждой службы.

Одноразовый токен доступа к ошибкам

На этой странице перечислены некоторые распространенные ошибки в коде сервисов:

  1. Facebook: Ошибка 467 Недействительный токен доступа – Просроченный, отозванный или иным образом недействительный токен доступа – Обработка токенов доступа с истекшим сроком действия.
  2. LinkedIn: Ошибка 401 не разрешена.
  3. PayPal: ошибка 401 не разрешена.

В течение месяца повторно проверьте токены.

Вам нужно будет повторить процесс авторизации, если срок действия refresh_token истек.

Спецификация OAuth 2.0 не определяет срок действия маркера обновления или способы его обработки, однако ряд API-интерфейсов вернет свойство refresh_token_expires_in когда токен обновления истечет. Разные API будут по-разному обрабатывать истечение срока действия маркера обновления, поэтому важно просматривать документы по API, но обычно вы можете получить новый токен обновления, когда обновляете свой токен доступа. Истечение срока действия должно обрабатываться аналогичным образом, например, путем преобразования refresh_token_expires_in в значение даты-времени refresh_token_expiry в RFC 3339.

В качестве примера можно привести RingCentral, eBay и LinkedIn. При обновлении токенов доступа вы также получаете сигнал refresh_token_expires_in, который направлен на начальное время истечения срока действия токена обновления, прежде чем он будет использован по назначению. Пользователю не нужно повторно проходить аутентификацию, поскольку токены в RingCentral API обновляются со статическим временем.

Ответ №1

401 может быть получен по ряду причин, включая: Изменение сертификата подписи токена или разница в часовых поясах.

  • Проверять 401 после каждого запроса API
  • Получение нового токена – только один раз
  • Повторение запроса API – только один раз

Я создал множество эффективных клиентов OAuth, и я никогда не сомневался в том, что в моем коде будет читаться поле expires_in.

Как токены работают?

В некоторых ситуациях для создания токенов используются донглы или брелоки, которые генерируют новые токены аутентификации каждые 60 секунд. Эти аппаратные средства должны быть доступны в любое время и не попадать в чужие руки. Если член команды уходит, он не может оставить брелок или донгл у себя.

Полезная нагрузка, заголовок и подпись присутствуют в наиболее типичных системах токенов. Тип полезной нагрузки и используемый алгоритм подписи содержатся в заголовке. Утверждения, относящиеся к пользователю, содержатся в полезной нагрузке.

Однако современные системы аутентификации токенов позволяют вносить любые изменения. Генераторы кодов, предоставляющие конечным пользователям ключи безопасности для доступа к сети в любое время, теперь могут быть добавлены в смартфоны.

Пользователям, которые входят в систему, предоставляется одноразовый код доступа, который действует в течение 30 или 60 секунд. Приложение аутентификатора на устройстве или SMS-запросы могут создавать эти мягкие маркеры.

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

Ключевой момент:

О БА токена обновляются при обновлении токена. Что нужно сделать, чтобы обновить маркер обновления после успешной аутентификации? Система выберет маркеры, если сравнение маркера обновления с маркером обновления базы данных будет успешным.

Обновление токена

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

«expires_in»

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

Получение токена


Теперь создадим функцию, которая будет получать json, описанный выше, и сохранять его.

Там, где нам удобнее, мы будем хранить данные авторизации в sessionStorage или local Storage. Информация хранится до тех пор, пока пользователь не завершит сеанс или не закроет браузер во втором сценарии.

Правильное использование access и refresh token (jwt) в php

1 – Payload — это любые данные, которые вы хотите передать в токене. Но стандарт предусматривает несколько зарезервированных полей:
iss — (issuer) издатель токена
sub — (subject) “тема”, назначение токена,описываемый объект
aud — (audience) аудитория, получатели токена
exp — (expire time) срок действия токена
nbf — (not before) срок, до которого токен не действителен
iat — (issued at) время создания токена
jti — (JWT id) идентификатор токена

пример:
{
“iss”: ” StuLux Team”,
“sub”: “auth”,
“exp”: 1505467756865,
“iat”: 1505467152065,
“user”: 3
}

2 – Пользователь логинится в приложении, передавая логин/пароль, в случае удачи создает запись в БД с рефреш токеном и временем его жизни, юзеру же возвращается сгенерированные сервером access и refresh токены JWT, для более подробного понимания можно разобрать примеры или использовать готовые решения библиотек с сайта https://jwt.io/#libraries.

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

4 – это назначение маркера обновления.

Более подробно можно почитать тут – https://vhod-v-lichnyj-kabinet.ru/zmts/802dc9c3510d79fd40f9dc38a12bccfc

Лично я советую сначала понять рабочий процесс без использования велосипедов и внедрить несколько готовых решений.

Создание функции-обертки

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

Поскольку если время жизни токена истекло, нам нужно будет запросить новый. Для этого мы воспользуемся конструкцией async/await.

Типы токенов авторизации

Существуют различные типы авторизационных токенов. Давайте рассмотрим их сейчас:

  1. Устройства, которые должны быть физически подключены. Например: ключи, диски и тому подобное. Каждый, кто когда-либо использовал USB-устройство или смарт-карту для входа в систему, сталкивался с подключенным токеном.
  2. Устройства, которые находятся достаточно близко к серверу, чтобы установить с ним соединение, но физически не подключены к нему. Примером такого типа токенов является “волшебное кольцо” компании Microsoft.
  3. Устройства, которые могут связываться с сервером на больших расстояниях.

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

Функция для обновления токена


function refreshToken(token) {
    return fetch('api/auth/refreshToken', {
        method: 'POST',
        credentials: 'include',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            token,
        }),
    })
        .then((res) => {
            if (res.status === 200) {
                const tokenData = res.json();
                saveToken(JSON.stringify(tokenData)); // сохраняем полученный обновленный токен в sessionStorage, с помощью функции, заданной ранее
                return Promise.resolve();
            }
            return Promise.reject();
        });
}

Теперь мы можем использовать апи для отправки запросов.

Функция для получения токена:


function getTokenData(login, password) {
    return fetch('api/auth', {
        method: 'POST',
        credentials: 'include',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            login,
            password,
        }),
    })
        .then((res) => {
            if (res.status === 200) {
                const tokenData = res.json();
                saveToken(JSON.stringify(tokenData)); // сохраняем полученный токен в sessionStorage, с помощью функции, заданной ранее
                return Promise.resolve()
            }
            return Promise.reject();
        });
}


Таким образом мы получили токен с полями

«access_token»«refresh_token»«expires_in»

И сохранили его в памятке.

sessionStorage

Для дальнейшего использования.

Функция для сохранения токена в sessionstorage:

function saveToken(token) {
    sessionStorage.setItem('tokenData', JSON.stringify(token));
}

Функция-обертка


export async function fetchWithAuth(url, options) {
    
    const loginUrl = '/login'; // url страницы для авторизации
    let tokenData = null; // объявляем локальную переменную tokenData

    if (sessionStorage.authToken) { // если в sessionStorage присутствует tokenData, то берем её
        tokenData = JSON.parse(localStorage.tokenData);
    } else {
       return window.location.replace(loginUrl); // если токен отсутствует, то перенаправляем пользователя на страницу авторизации
    }

    if (!options.headers) { // если в запросе отсутствует headers, то задаем их
        options.headers = {};
    }
    
    if (tokenData) {
        if (Date.now() >= tokenData.expires_on * 1000) { // проверяем не истек ли срок жизни токена
            try {
                const newToken = await refreshToken(tokenData.refresh_token); // если истек, то обновляем токен с помощью refresh_token
                saveToken(newToken);
            } catch () { // если тут что-то пошло не так, то перенаправляем пользователя на страницу авторизации
               return  window.location.replace(loginUrl);
            }
        }

        options.headers.Authorization = `Bearer ${tokenData.token}`; // добавляем токен в headers запроса
    }

    return fetch(url, options); // возвращаем изначальную функцию, но уже с валидным токеном в headers
}

Функция, добавляющая токен к запросам API, записана в коде ниже. Мы можем добиться этого, заменив fetch на fetch в нужных запросах, вызывающих авторизацию.


Просто достаточно будет «импортнуть» ее в файл и заменить на нее стандартный fetch.

import fetchWithAuth from './api';

function getData() {
    return fetchWithAuth('api/data', options)
}

В итоге:

P.s. Каждая задача получает уникальный подход! Не беспокойтесь об этом во время небольших/средних сессий монолитного печенья. Если это соответствует вашим вкусам, то:)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *