Как изменить токен в браузере

Обновлено: 07.07.2024

Яндекс.OAuth возвращает токен и новый refresh-токен в теле ответа.

Примечание. Основной токен может не обновиться, если оставшийся срок его жизни достаточно длительный и выдавать новый токен нет необходимости. Рекомендуем обновлять долгоживущие токены раз в три месяца.

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

Обмен refresh-токена на OAuth-токен

Приложение отправляет refresh-токен, а также свой идентификатор и пароль в POST-запросе.

Способ запроса OAuth-токена.

Если вы используете refresh-токен, укажите значение «refresh_token»

Refresh-токен, полученный от Яндекс.OAuth вместе с OAuth-токеном. Время жизни токенов совпадает.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Способ запроса OAuth-токена.

Если вы используете refresh-токен, укажите значение «refresh_token»

Refresh-токен, полученный от Яндекс.OAuth вместе с OAuth-токеном. Время жизни токенов совпадает.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Формат ответа с токеном

Яндекс.OAuth возвращает OAuth-токен, refresh-токен и время их жизни в JSON-формате:

OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения.

Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена.

Тип выданного токена. Всегда принимает значение «bearer» .

Время жизни токена в секундах.

OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения.

Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена.

Тип выданного токена. Всегда принимает значение «bearer» .

Время жизни токена в секундах.

Если выдать токен не удалось, то ответ содержит описание ошибки:

Возможные коды ошибок:

invalid_client ― приложение с указанным идентификатором (параметр client_id ) не найдено или заблокировано. Этот код также возвращается, если в параметре client_secret передан неверный пароль приложения. invalid_grant — неверный или просроченный refresh-токен . Этот код также возвращается, если в refresh-токен принадлежит другому приложению (не соответствует переданному client_id). invalid_request ― неверный формат запроса (один из параметров не указан, указан дважды, или передан не в теле запроса). unauthorized_client — приложение было отклонено при модерации или только ожидает ее. unsupported_grant_type ― недопустимое значение параметра grant_type . Basic auth required — тип авторизации, указанный в заголовке Authorization , отличен от Basic . Malformed Authorization header — заголовок Authorization не соответствует формату &lt;client_id&gt;:&lt;client_secret&gt; , или эта строка не закодирована методом base64. ">,"extra_meta":[>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>,>],"title":"Обновить токен","productName":"Руководство разработчика","extra_js":[[],[,"mods":<>,"__func136":true,"tag":"script","bem":false,"attrs":,"__func63":true>,,"mods":<>,"__func136":true,"tag":"script","bem":false,"attrs":,"__func63":true>],[,"mods":<>,"__func136":true,"tag":"script","bem":false,"attrs":,"__func63":true>]],"extra_css":[[],[,"mods":<>,"__func65":true,"__func64":true,"bem":false,"tag":"link","attrs":>,,"mods":<>,"__func65":true,"__func64":true,"bem":false,"tag":"link","attrs":>],[,"mods":<>,"__func65":true,"__func64":true,"bem":false,"tag":"link","attrs":>]],"csp":<"script-src":[]>,"documentPath":"/dev/oauth/doc/dg/reference/refresh-client.html","isBreadcrumbsEnabled":true,"lang":"ru","params":<>>>>'>Получение токена в обмен на refresh-токен:

Яндекс.OAuth возвращает токен и новый refresh-токен в теле ответа.

Примечание. Основной токен может не обновиться, если оставшийся срок его жизни достаточно длительный и выдавать новый токен нет необходимости. Рекомендуем обновлять долгоживущие токены раз в три месяца.

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

Обмен refresh-токена на OAuth-токен

Приложение отправляет refresh-токен, а также свой идентификатор и пароль в POST-запросе.

Способ запроса OAuth-токена.

Если вы используете refresh-токен, укажите значение «refresh_token»

Refresh-токен, полученный от Яндекс.OAuth вместе с OAuth-токеном. Время жизни токенов совпадает.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Способ запроса OAuth-токена.

Если вы используете refresh-токен, укажите значение «refresh_token»

Refresh-токен, полученный от Яндекс.OAuth вместе с OAuth-токеном. Время жизни токенов совпадает.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

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

Пароль и идентификатор приложения также можно передать в заголовке Authorization.

Формат ответа с токеном

Яндекс.OAuth возвращает OAuth-токен, refresh-токен и время их жизни в JSON-формате:

OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения.

Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена.

В данной статье мы разберём, как сделать открытие Сбербанк Бизнес Онлайн с токена в любом другом браузере, а не в Internet Explorer, как он открывается по умолчанию.

По умолчанию Сбербанк Бизнес Онлайн (СБОЛ), вход в который производится через файл start.exe на токене, открывает банкинг в браузере Internet Explorer. Однако, для некоторых пользователей IE может оказаться неудобен или непривычен в работе. Кроме того, IE не обновляется уже давно (Microsoft ведь перешла на новый браузер на основе Chrome – Microsoft Edge, и и прекратила стабильную поддержку IE), но СБОЛ постоянно радует нас новыми обновлениями, которые, возможно, в скором времени перестанут поддерживаться IE.

Потому давайте разберём, как же по умолчанию открывать СБОЛ с токена в любом другом браузере.

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

Свойства ярлыка Firefox

Скопируйте значение из поля "Объект". Это путь до исполняемого файла браузера. На него нужно будет заменить строку далее.

После этого откройте редактор реестра: Win+R – "regedit" – ОК

В редакторе реестра перейдите по пути HKEY_CLASSES_ROOT\http\shell\open\command и найдите значение "(По умолчанию)".

Редактор реестра, раздел HKEY_CLASSES_ROOT\http\shell\open\command

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

По итогу, строка должна выглядеть примерно так:
"C:\Program Files\Mozilla Firefox\firefox.exe" %1

После этого попробуйте вновь открыть СБОЛ.


Многие приложения используют JSON Web Tokens (JWT), чтобы позволить клиенту идентифицировать себя для дальнейшего обмена информацией после аутентификации.


JSON Web Token – это открытый стандарт (RFC 7519), который определяет компактный и автономный способ безопасной передачи информации между сторонами в виде объекта JSON.


Эта информация является проверенной и надежной, потому что она имеет цифровую подпись.
JWT могут быть подписаны с использованием секретного (с помощью алгоритма HMAC) или пары открытого / секретного ключей с использованием RSA или ECDSA.

JSON Web Token используется для передачи информации, касающейся личности и характеристик клиента. Этот «контейнер» подписывается сервером, чтобы клиент не вмешивался в него и не мог изменить, например, идентификационные данные или какие-либо характеристики (например, роль с простого пользователя на администратора или изменить логин клиента).

Соображения по поводу использования JWT

Даже если токен JWT прост в использовании и позволяет предоставлять сервисы (в основном REST) без сохранения состояния (stateless), такое решение подходит не для всех приложений, потому что оно поставляется с некоторыми оговорками, как, например, вопрос хранения токена.

Если приложение не должно быть полностью stateless, то можно рассмотреть возможность использования традиционной системы сессий, предоставляемой всеми веб-платформами. Однако для stateless приложений JWT – это хороший вариант, если он правильно реализован.

Проблемы и атаки, связанные с JWT

Использование алгоритма хеширования NONE

Подобная атака происходит, когда злоумышленник изменяет токен, а также меняет алгоритм хеширования (поле “alg”), чтобы указать через ключевое слово none, что целостность токена уже проверена. Некоторые библиотеки рассматривали токены, подписанные с помощью алгоритма none, как действительный токен с проверенной подписью, поэтому злоумышленник мог изменить полезную нагрузку (payload) токена, и приложение доверяло бы токену.

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

Пример реализации:

Перехват токенов

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

Защита заключается в добавлении «пользовательского контекста» в токен. Пользовательский контекст будет состоять из следующей информации:

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

Код для создания токена после успешной аутентификации:

Код для проверки валидности токена:

Явное аннулирование токена пользователем

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

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

В черном списке будет храниться сборник (в кодировке SHA-256 в HEX) токена с датой аннулирования, которая должна превышать срок действия выданного токена.

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

Пример реализации:

Хранилище черного списка:
Для централизованного хранения черного списка будет использоваться база данных со следующей структурой:


Управление аннулированиями токенов:

Раскрытие информации о токене

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

Способ защиты достаточно очевиден и заключается в шифровании токена. Также важно защитить зашифрованные данные от атак с использованием криптоанализа. Для достижения всех этих целей используется алгоритм AES-GCM, который обеспечивает аутентифицированное шифрование с ассоциированными данными (Authenticated Encryption with Associated Data – AEAD). Примитив AEAD обеспечивает функциональность симметричного аутентифицированного шифрования. Реализации этого примитива защищены от адаптивных атак на основе подобранного шифртекста. При шифровании открытого текста можно дополнительно указать связанные данные, которые должны быть аутентифицированы, но не зашифрованы.

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

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

Хранение токенов на стороне клиента

Если приложение хранит токен так, что возникает одна или несколько из следующих ситуаций:

  • токен автоматически отправляется браузером (сookie storage);
  • токен получается, даже если браузер перезапущен (использование контейнера localStorage браузера);
  • токен получается в случае атаки XSS (сookie, доступный для кода JavaScript или токен, который хранится в localStorage или sessionStorage).

  1. Хранить токен в браузере, используя контейнер sessionStorage.
  2. Добавить его в заголовок Authorization, используя схему Bearer. Заголовок должен выглядеть следующим образом:

Остается случай, когда злоумышленник использует контекст просмотра пользователя в качестве прокси-сервера, чтобы использовать целевое приложение через легитимного пользователя, но Content Security Policy может предотвратить связь с непредвиденными доменами.

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

Использование слабого ключа при создании токена

Если секрет, используемый в случае алгоритма HMAC-SHA256, необходимый для подписи токена, является слабым, то он может быть взломан (подобран c помощью атаки грубой силы). В результате злоумышленник может подделать произвольный действительный токен с точки зрения подписи.

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

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


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

Доброго времени суток, дорогой читатель. В данной статье я постараюсь рассказать об одном из самых популярных (на сегодняшний день) способов авторизации в различных клиент-серверных приложениях - токен авторизации. А рассматривать мы его будем на примере самой популярной реализации - JSON Web Token или JWT.

Введение

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

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

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

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

Еще одно небольшое введение

Формальное определение

Приступим наконец к работе самого токена. Как я сказал ранее в качестве токенов наиболее часто рассматривают JSON Web Tokens (JWT) и хотя реализации бывают разные, но токены JWT превратились в некий стандарт, именно поэтому будем рассматривать именно на его примере.

JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанный на формате JSON.

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

Принцип работы

Рассмотрим принцип работы клиент серверных приложений, работающих с помощью JWT. Первым делом пользователь проходит аутентификацию, конечно же если не делал этого ранее и в этом есть необходимость, а именно, например, вводит свой логин и пароль. Далее приложение выдаст ему 2 токена: access token и refresh token (для чего нужен второй мы обсудим ниже, сейчас речь идет именно об access token). Пользователь тем или иным способом сохраняет его себе, например, в локальном хранилище или в хранилище сессий. Затем, когда пользователь делает запрос к API приложения он добавляет полученный ранее access token. И наконец наше приложение, получив данный запрос с токеном, проверяет что данный токен действительный (об этой проверке, опять же, ниже), вычитывает полезные данные, которые помогут идентифицировать пользователя и проверить, что он имеет право на запрашиваемые ресурсы. Таким нехитрым образом происходит основная логика работы с JSON Web Tokens.

Структура токена

Пришло время обсудить структуру токена и тем самым лучше разобраться в его работе. Первое что следует отметить, что JWT токен состоит из трех частей, разделенных через точку:

Полезные данные (playload)

funnytorimage.pw

funnytorimage.pw

Рассмотрим каждую часть по подробнее.

Заголовок

Это первая часть токена. Она служит прежде всего для хранения информации о токене, которая должна рассказать о том, как нам прочитать дальнейшие данные, передаваемые JWT. Заголовок представлен в виде JSON объекта, закодированного в Base64-URL Например:

Если раскодировать данную строку получим:

Заголовок содержит два главных поля: alg и typ. Поле typ служит для информации о типе токена, но как я уже упоминал ранее, что JWT превратился в некий стандарт, то это поле перестало нести особый смысл и служит скорее для целей будущего, если вдруг появится улучшенная версия алгоритма JWT(2.0), которая заменит JWT. Поле alg задает алгоритм шифрования. Обязательный для поддержки всеми реализациями является алгоритм HMAC с использованием SHA-256, или же, как он обозначен в заголовке, HS256. Для работы с этим алгоритмом нужен один секретный ключ, конкретный механизм работы рассмотрим ниже. Для справки можно также отметить, что существует и асимметричный алгоритм, который можно использовать в JWT, например, RS256. Для работы с ним требуется два ключа - открытый и закрытый. Но в данной статье рассмотрим работу с одним закрытым ключом.

Полезные данные

Перейдем наконец к полезным данным. Опять же - это JSON объект, который для удобства и безопасности передачи представляется строкой, закодированной в base64. Наглядный пример полезных данных (playload) токена может быть представлен следующей строкой:

Что в JSON формате представляет собой:

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

iss - используется для указания приложения, из которого отправляется токен.

user_id - для идентификации пользователя в нашем приложении, кому принадлежит токен.

Одной из самых важных характеристик любого токена является время его жизни, которое может быть задано полем exp. По нему происходит проверка, актуален ли токен еще (что происходит, когда токен перестает быть актуальным можно узнать ниже). Как я уже упоминал, токен может помочь с проблемой авторизации, именно в полезных данных мы можем добавить свои поля, которые будут отражать возможности взаимодействия пользователя с нашим приложением. Например, мы можем добавить поле is_admin или же is_preferUser, где можем указать имеет ли пользователь права на те или иные действия, и при каждом новом запросе с легкостью проверять, не противоречат ли запрашиваемые действия с разрешенными. Ну а что же делать, если попробовать изменить токен и указать, например, что мы являемся администраторами, хотя таковыми никогда не были. Здесь мы плавно можем перейти к третьей и заключительной части нашего JWT.

Подпись

На данный момент мы поняли, что пока токен никак не защищен и не зашифрован, и любой может изменить его и тем самым нарушается вообще весь смысл аутентификации. Эту проблему призвана решить последняя часть токена - а именно сигнатура (подпись). Происходит следующее: наше приложение при прохождении пользователем процедуры подтверждения, что он тот за кого себя выдает, генерирует этот самый токен, определяет поля, которые нужны, записывает туда данные, которые характеризуют данного пользователя, а дальше с помощью заранее выбранного алгоритма (который отмечается в заголовке в поле alg токена), например HMAC-SHA256, и с помощью своего приватного ключа (или некой секретной фразы, которая находится только на серверах приложения) все данные токена подписываются. И затем сформированная подпись добавляется, также в формате base64, в конец токена. Таким образом наш итоговый токен представляет собой закодированную и подписанную строку. И далее при каждом новом запросе к API нашего приложения, сервер с помощью своего секретного ключа сможет проверить эту подпись и тем самым убедиться, что токен не был изменен. Эта проверка представляет собой похожую на подпись операцию, а именно, получив токен при новом запросе, он вынимает заголовок и полезные данные, затем подписывает их своим секретным ключом, и затем идет просто сравнение двух получившихся строк. Таким нехитрым способом, если не скомпроментировать секретный ключ, мы всегда можем знать, что перед нами все еще наш %user_name% с четко отведенными ему правами.

Время жизни токена и Refresh Token

Теперь плавно перейдем к следующему вопросу - времени жизни токена, и сопутствующей этой теме refresh token. Мы помним, что одно из важнейших свойств токена - это время его жизни. И оно совсем недолговечное, а именно 10-30 минут. Может возникнуть вопрос: а зачем такое короткое время жизни, ведь тогда придется каждый раз заново создавать новый токен, а это лишняя нагрузка на приложения. А ответ достаточно очевидный, который включает в себя и одновременно ответ на вопрос: а что делать если токен был перехвачен. Действительно, если токен был перехвачен, то это большая беда, так как злоумышленник получает доступ к приложению от имени нашего %user_name%, но так как access token является короткоживущим, то это происходит лишь на недолгий период. А дальше этот токен уже является не валидным. И именно чтобы обновить и получить новый access token нужен refresh token. Как мы знаем (или если забыли можем снова прочитать в начале) пользователь после процесса аутентификацию получает оба этих токена. И теперь по истечении времени жизни access token мы отсылаем в приложение refresh token и в ответ получаем снова два новых токена, опять же один многоразовый, но ограниченный по времени - токен доступа, а второй одноразовый, но долгоживущий - токен обновления. Время жизни refresh token вполне может измеряться месяцами, что достаточно для активного пользователя, но в случае если и этот токен окажется не валидным, то пользователю следует заново пройти идентификацию и аутентификацию, и он снова получит два токена. И весь механизм работы повторится.

Заключение

В данной статье я постарался подробно рассмотреть работу клиент-серверных приложений с токеном доступа, а конкретно на примере JSON Web Token (JWT). Еще раз хочется отметить с какой сравнительной легкостью, но в тоже время хорошей надежностью, токен позволяет решать проблемы аутентификации и авторизации, что и сделало его таким популярным. Спасибо за уделенное время.

Читайте также: