Ошибка срок действия токена истек

On my server I’m seeing these errors when using firebase admin sdk .verifyIdToken()

Firebase ID token has expired. Get a fresh token from your client app and try again

Firebase ID token has «kid» claim which does not correspond to a known public key. Most likely the ID token is expired, so get a fresh token from your client app and try again. See https://firebase.google.com/docs/auth/admin/verify-id-tokens for details on how to retrieve an ID token.

On the client side I’m doing this before every request between browser <> server:

firebase.auth().currentUser.getIdToken()

It’s my understanding from reading the docs that this function will get a valid, non-expired token because the SDK in the background will refresh itself as-needed. Optionally, I can pass in true to this function to force a refresh.

Why does this getIdToken() function seem to be sending expired tokens to my backend?

It seems like to resolve this my options are:

  1. Pass in true to force refresh every time I call getIdToken(). This is needlessly expensive because it will add the overhead of a whole round-trip network request from the browser <> firebase before the request from browser <> my server
  2. call getIdToken() the way I am now — decode the token manually on the client side, check the expiration, if it is expired then call getIdToken(true) again to force a refresh and send that newly refreshed token to my server

Is number 2 the recommended/expected way to deal with this? It seems like something is wrong here…

Community's user avatar

asked Dec 13, 2017 at 23:10

dylanjha's user avatar

4

The token expires after typically an hour. getIdToken will refresh the cached token if it is expired. Make sure you always call that on the client when you need to send the token to your server. If you cache the token and always send it to your backend, it will be expired at some point.

Also just in case, ensure your server clock is synchronized. It is unlikely but your clock could be out of sync for some reason.

answered Dec 14, 2017 at 3:30

bojeil's user avatar

bojeilbojeil

29.3k4 gold badges67 silver badges76 bronze badges

10

Another possible solution above the mentioned, is that your browser (Or system) date is wrong. Is it almost always related to the date.

answered Apr 13, 2020 at 5:09

Martin De Simone's user avatar

Martin De SimoneMartin De Simone

2,1083 gold badges15 silver badges30 bronze badges

4

Error: Firebase ID token has expired

You will get this error when your device time is wrong. Check your device clock time as well.

answered Nov 10, 2020 at 12:09

isuru's user avatar

isuruisuru

3,3254 gold badges24 silver badges62 bronze badges

If you are using token on your backend, then you can do the following,

1.Check token on backend

2.If token has expired, send 401 unauthorized.

3.On the client, check if status code is 401 unautorized, if so call getIdToken and save new token

Arghya Sadhu's user avatar

Arghya Sadhu

40.1k9 gold badges76 silver badges106 bronze badges

answered Aug 27, 2020 at 1:51

Rahul Kumar's user avatar

I faced the same problem before and after some try and error, I found out that it was being caused by time sync.

I set my computer time and time zone to automatic and fixed the issue.
Also, remember to add «true» in getIdToken(true)

answered Sep 17, 2020 at 10:35

Francois MUGOROZI's user avatar

2

Try using something more like this:

Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in

/* your code to manage error and success */

}

answered Jul 1, 2018 at 0:51

Stephane Paquet's user avatar

Did you notice that there is an async way of getting the token?

            mAuth.getCurrentUser().getIdToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
            @Override
            public void onSuccess(GetTokenResult getTokenResult) {
                long time = System.currentTimeMillis() - starttime;

                Log.d("testt", "time " + time + ", token " + getTokenResult.getToken());
            }
        });

Not sure, but I guess that it does internal checking and if token is not valid any more(for example there was a refreshed token broadcast for current user and it didn’t reached to the user for some reason, network issue for example), it requests new one and returns that.

P.S. I am doing a research on this topic as well and will update if will find out anything new.

answered Jul 3, 2018 at 11:28

Andranik's user avatar

AndranikAndranik

2,6891 gold badge29 silver badges43 bronze badges

Если вы столкнулись с ошибкой «истек CSRF-токен» — читайте нашу статью. Из неё вы узнаете, как работает CSRF-token защита, и что делать, если CSRF токен истек.


Ошибка токен истек 1

Что такое CSRF

CSRF (англ. cross-site request forgery) — это межсайтовая подделка запроса. Это атака, которой может подвергаться любой веб-ресурс или веб-приложение. В первую очередь это касается сайтов, которые используют cookies, сертификаты авторизации и браузерную аутентификацию. В результате атаки страдают клиенты и репутация ресурса.

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

Как работает CSRF-атака

Злоумышленник может использовать фишинговую ссылку — это наиболее распространенный способ обмана. В этом случае атака работает по следующей схеме:

  1. Злоумышленник создаёт поддельную страницу, очень похожую на оригинальную, и встраивает её в сайт. В коде ссылка может выглядеть так: <a href=“вредоносная ссылка”>Unsubscribe here</a>.
  2. Пользователь переходит с одной страницы сайта на другую (например, на страницу оплаты) и вместо реальной страницы попадает на поддельную.
  3. Пользователь совершает действие на странице, например, оплачивает товар или вводит данные авторизации.
  4. Информация или денежные средства вместо оригинального сервера уходят на сервер мошенника.

CSRF-атаки случаются из-за того, что без специальных настроек сервер не может с точностью в 100% определить, кто именно выполняет действия со стороны пользователя. Он не может проверить, действительно ли на кнопку “оплатить” нажал тот пользователь, который изначально открыл страницу с оплатой. Хакеры активно используют этот люфт в безопасности HTTP-запросов и применяют вредоносные скрипты. Однако от атаки можно защититься с помощью CSRF-токенов. 

Что такое CSRF-token и как он работает

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

CSRF-token — это максимально простой и результативный способ защиты сайта от CSRF-мошенников. Он работает так: сервер создаёт случайный ключ (он же токен) и отправляет его браузеру клиента. Когда браузер запрашивает у сервера информацию, сервер, прежде чем дать ответ, требует показать ключ и проверяет его достоверность. Если токен совпадает, сессия продолжается, а если нет — прерывается. Токен действителен только одну сессию — с новой сессией он обновляется.

Чтобы получить ответ от сервера, используются разные методы запроса. Условно они делятся на две категории: те, которые не изменяют состояние сервера (GET, TRACE, HEAD), и те, которые изменяют (PUT, PATCH, POST и DELETE). Последние имеют большую CSRF-уязвимость и поэтому должны быть защищены в первую очередь.

При создании и использовании токена должны соблюдаться следующие условия:

  • нахождение в скрытом параметре;

  • генерация с помощью генератора псевдослучайных чисел;

  • ограниченное время жизни (одна сессия);

  • уникальность для каждой транзакции;

  • устойчивый к подбору размер (в битах);

  • невозможно переиспользовать.

Типы токенов

Существует три основных типа токенов по способу генерации:

  1. Synchronizer Tokens или Anti-CSRF (токены синхронизации). В этом случае инициатором ключа выступает сервер — на нём хранится исходная шифровка. Когда браузер обращается к серверу и предъявляет ему ключ, сервер сравнивает его с исходником и в зависимости от результата продолжает или прерывает сессию.
  2. Double Submit Cookie (двойная отправка куки). При этом способе токен нигде не хранится. Когда браузер обращается к серверу впервые за сессию, сервер генерирует и передаёт ему ключ в двух формах: через куки и в одном из параметров ответа. При следующих обращениях браузера сервер дважды проверяет правильность ключа — в параметрах и в куках.
  3. Encrypted Token (зашифрованный токен). Этот способ предполагает, что ключом шифруется какая-то часть информации о клиенте, которая содержится в браузере. При первом запросе браузера сервер получает информацию о пользователе, зашифровывает её и передаёт браузеру токен. При следующем взаимодействии сервер расшифровывает токен и сверяет информацию.

Помимо токенов, для защиты используется флаг Same-Site (большинство браузеров его поддерживает). Он работает напрямую для cookies и позволяет помечать куки конкретного домена. Сервер проверяет, содержатся ли нужные пометки в куках страницы, с которых происходит оплата или вносятся изменения. Если пометок нет — сессия прекращается.

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

«Истек срок действия токена» или «CSRF-значение недопустимо»: что это значит и что делать

Даже при авторизации на сайтах, для которых настроена защита от атак, можно встретить следующие варианты сообщения об ошибке: «Недопустимое CSRF-значение»/«CSRF-токены не совпадают» или «Token expired» (в переводе — срок действия токена истек). Сообщение может отображаться как на английском, так и на русском. Пример ошибки при авторизации на сайте REG.RU:



Ошибка токен истек 2

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

  • сервер некорректно сгенерировал токен;

  • срок токена истек — пользователь долго не совершал никаких действий на странице.

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


Ошибка токен истек 3

Иногда ошибка возникает из-за расширений защиты конфиденциальности или плагинов блокировки рекламы (например, Ghostery, UBlock Origin, Blur), которые настроены у пользователя. В этом случае можно отключить расширение. Также можно добавить сайт, на котором появилось сообщение, в список доверенных сайтов.

На примере сайта reg.ru покажем, что для этого нужно:

в Google Chrome

  1. Откройте настройки Chrome:

    Ошибка токен истек 4

  2. В списке слева выберите Конфиденциальность и безопасность, а затем Файлы cookie и другие данные сайтов.
  3. Внизу страницы откройте Сайты, которые всегда могут использовать файлы cookie и кликните Добавить.
  4. Введите «[*.]www.reg.ru» и нажмите Добавить.
  5. Нажмите Все файлы cookie и данные сайта и удалите все записи, которые связаны с сайтом reg.ru.
  6. Перезагрузите браузер и выполните операцию повторно.

в Яндекс.Браузер

  1. Откройте настройки браузера Яндекс:

    20220125_chto_oznachayet_oshibka_csrf_token_istek_5.png

  2. Перейдите на Сайты Расширенные.
  3. Кликните Настройки… для первого параметра в списке. Затем на вкладке «Разрешена» введите www.reg.ru и кликните Добавить.
  4. Добавьте адрес сайта для всех параметров списка по аналогии.

в Safari

  1. Откройте настройки Safari комбинацией Cmd + , (⌘,).
  2. Перейдите на вкладку Конфиденциальность и проверьте, что в пункте «Файлы cookie и данные веб-сайтов» не выбрано «Блокировать все файлы cookie». Если это так, снимите настройки.
  3. Кликните Управление данными веб-сайтов и удалите все записи, которые относятся к www.reg.ru.
  4. Перезагрузите браузер и выполните операцию повторно.

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

Заключение

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

Эта статья научит вас, как исправить ошибку «CSRF token истёк», которую вы можете получить при посещении сайта, и больше расскажет о CSRF-атаках в целом.

Что такое CSRF

CSRF (от англ. cross-site request forgery) или межсайтовая подделка запроса – это форма атаки на любой сайт или веб-приложение. С помощью подделки запросов мошенник обманом заставляет пользователя выполнять нежелательные действия на, казалось бы, проверенной платформе.

Как работает CSRF-атака

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

Выполнение CSRF-атаки состоит из двух основных частей.

  1. Злоумышленник заставляет жертву щёлкнуть на ссылку или загрузить веб-страницу. Он намеренно заманивает пользователя перейти по ссылке, используя методы социальной инженерии.
  2. Отправляет «поддельный» или выдуманный запрос в браузер жертвы. Вредоносная ссылка отправит запрос в веб-приложение, однако будет включать в себя значения, которые выгодны злоумышленнику.

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

Примеры CSRF-атаки

Для того, чтобы получить ответ от сервера, в протоколе применяют различные методы HTTP-запросов. Наиболее часто используемые – это GET, POST, PUT, PATCH и DELETE.

Они используются и для создания межсайтовой подделки запроса.

Пример GET CSRF-атаки:

В следующем примере показано, как выглядит типичный GET-запрос для банковского перевода в размере 1000 долларов.

GET https://randombank.ru/transfer.do?account=RandPerson&amount=$1000 HTTP/1.1

Злоумышленник может изменить ссылку таким образом, что она приведёт к переводу 1000 долларов на его личный счет. Вредоносный запрос будет выглядеть так:

GET https://randombank.ru/transfer.do?account=SomeAttacker&amount=$1000 HTTP/1.1

Если задействованное приложение ожидает GET-запрос, злоумышленник может разместить на своем веб-сайте тег, который вместо ссылки на изображение отправит поддельный запрос.

<img src=»вредоносная ссылка» />

Пример POST CSRF-атаки:

<h1>Вы выиграли приз!</h1>

<form action=” www.shopshop.ru/api/account» method=”post”>

<input type=”hidden” name=”Transaction” value=”withdraw” />

<input type=”hidden” name=”Amount” value=”1000000″ />

<input type=”submit” value=”Click Me”/>

</form>

  1. Пользователь входит на сайт www.shopshop.ru с помощью своих логина и пароля.
  2. Сервер авторизует пользователя, а ответ от сервера включает файл cookie аутентификации.
  3. Не выходя из системы, пользователь посещает вредоносную веб-страницу. Этот сайт содержит HTML-форму, указанную выше.
  4. Пользователь нажимает кнопку отправки. Браузер отправляет файл cookie аутентификации вместе с запросом.
  5. Сервер обрабатывает запрос, учитывая, что пользователь уже находится в аккаунте, поэтому злоумышленник получает доступ ко всему, что разрешено делать авторизованному пользователю.

Что такое токен CSRF

Токен CSRF – это уникальное и непредсказуемое значение, которое сервер генерирует для защиты уязвимых перед CSRF ресурсов.

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

Таким образом, можно выделить основные признаки токена CSRF:

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

Ошибки CSRF: почему возникают и как их исправить?

Сообщения «Неверный токен CSRF» или «Срок действия токена CSRF истёк» означает, что ваш браузер не смог создать безопасный файл cookie или не смог получить доступ к этому файлу cookie для авторизации вашего входа в систему.

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

Есть несколько причин, по которым вы можете получать сообщения об ошибках:

  • срок действия старого токена действительно истёк, так как прошло более 24 часов;
  • уже был отправлен новый токен, в связи с чем старый стал недействительным;
  • плагины или расширения блокируют запросы;
  • браузеру не разрешено устанавливать файлы cookie.

Иногда нужно лишь обновить свою страницу или вновь войти в систему, и всё будет готово для продолжения вашей работы. Если это не помогает, есть способы исправить это в разных браузерах.

Как исправить ошибки CSRF в браузерах

Google Chrome

  1. В правом верхнем углу экрана щёлкните на значок с тремя точками и в меню выберите Настройки.

  1. В панели слева откройте вкладку Конфиденциальность и безопасность.
  2. Выберите Файлы cookie и другие данные сайтов.

  1. Пролистайте до раздела «Специальные настройки» и щёлкните Добавить рядом с графой «Сайты, которые всегда могут использовать файлы cookie».
  2. Чтобы включить сайт в этот список, введите название нужного сайта по форме [*.]ваш.сайт и затем нажмите Добавить.

  1. В разделе Посмотреть все разрешения и данный сайтов найдите nic.ru и удалите все записи, связанные с сайтом.
  2. Перезагрузите браузер и вновь войдите на сайт.

Microsoft Edge

  1. Откройте меню в правом верхнем углу экрана и щёлкните Настройки.
  2. В параметрах перейдите в раздел Файлы cookie и разрешения сайтов.
  3. Нажмите «Управляйте файлами cookie и данными сайта…».

  1. Нажмите Добавить рядом со словом «Разрешить», чтобы внести сайт в список и позволить браузеру сохранять с него файлы cookie.
  2. Введите [*.]ваш.сайт и подтвердите своё решение, нажав Добавить.
  3. Перейдите во вкладку Посмотреть все файлы cookie и данные сайта и удалите всё, связанное с выбранным сайтом.

  1. Перезагрузите браузер.

Яндекс.Браузер

  1. Откройте меню, щёлкнув на значок с тремя линиями в верхнем углу экрана, и перейдите в Настройки.

  1. В левой панели выберите вкладку Сайты и найдите в ней опцию Расширенные настройки сайтов.
  2. Пролистайте вниз до раздела Cookie-файлы. Откройте Настройки сайтов под ним.
  3. Нажмите Добавить.

  1. Введите [*.]ваш.сайт и подтвердите своё решение, нажав Добавить.
  2. Вернитесь на предыдущую страницу и перейдите в Cookie-файлы и данные сайтов. Кнопка находится рядом с Настройками сайтов.
  3. Удалите все данные о сайте.
  4. Перезагрузите браузер.

Opera

  1. В левой панели экрана щёлкните на значок Настроек.
  2. Выберите раздел Безопасность, а затем нажмите Файлы cookie и прочие данные сайтов.

  1. В разделе «Настраиваемое поведение» у параметра Сайты, которые всегда могут использовать файлы cookie щёлкните Добавить.

  1. Введите [*.]ваш.сайт и подтвердите своё решение, нажав Добавить.
  2. Чуть выше выберите опцию Все файлы cookie и данные сайта и удалите все данные о сайте.
  3. Перезагрузите ваш браузер и вновь откройте сайт.

Safari

  1. Откройте Настройки Safari в верхней части экрана или с помощью сочетания клавиш Cmd + ,.
  2. Перейдите на вкладку Конфиденциальность и убедитесь, что для параметра «Файлы cookie и данные веб-сайтов» не установлено значение «Блокировать все файлы cookie».
  3. Затем нажмите Управлять данными веб-сайта…, найдите [ваш.сайт] и удалите все записи, связанные с сайтом.
  4. Перезагрузите Safari и проверьте сайт на наличие ошибки.

Заключение

Файлы cookie изначально уязвимы перед CSRF-атаками, поскольку они автоматически отправляются с каждым запросом. Это позволяет злоумышленникам легко создавать вредоносные запросы, которые приводят к межсайтовым подделкам запросов. Хотя извлечение конфиденциальной информации не является основной целью атаки CSRF, это может оказать неблагоприятное воздействие на используемое приложение.

В этой статье вы узнали больше о явлении CSRF-атак, токенах, а также о том, что именно защищает вас от уловок современных злоумышленников и что делать, если появляются ошибки «Токен-CSRF истёк» или «Неверный токен CSRF».

# #javascript #firebase #firebase-authentication #angularfire

Вопрос:

Предыстория:
Мы вручную отзываем наши токены обновления firebase с помощью пакета SDK администратора firebase в нашем бэкэнде. В нашем приложении angular мы используем метод onAuthStateChanged firebase.auth (), чтобы определить, прошел ли пользователь аутентификацию. С результатом onAuthStateChanged мы используем метод .getIdTokenResult (), чтобы получить некоторые метаданные о пользователе и сохранить их локально.

Проблема:
После отзыва токена обновления пользователя с нашего бэкенда мы ждем истечения срока действия идентификационного токена клиента (в течение часа). Ближе к истечению срока действия мы замечаем, что в журнале клиентской консоли появляется необнаруженная ошибка. Мы понимаем, что это нормально, так как мы только что отозвали токен обновления, и это было связано с обновлением. Проблема в том, что мы не можем понять, где поймать это исключение и где оно выбрасывается. Мы разместили .catches() , try/catches и предоставили обратные вызовы ошибок для всех подозрительных вызовов (onAuthStateChanged, getIdTokenResult), но, похоже, мы все еще получаем исключение.

Существует ли внутренний процесс, который автоматически пытается обновить токены? Если да, то как нам поймать эту ошибку?

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

Сведения об ошибке:

 code: auth/user-token-expired
message: The user's credential is no longer valid. The user must sign in again.
 

А вот бессмысленная трассировка стека
вот бессмысленная трассировка стека

Предисловие:

ВnodeПроходитьjwtИспользоватьtokenTime, вы обнаружите, что по истечении времени ожидания будет сообщено об ошибке 500.

Снимок экрана с ошибкой:

Решение:

Исходный код:

/**
 * Проверить, истек ли срок действия токена
 * */
function verson(req){
    var token=req.headers.token;
    let con = jwt.verify(token, 'x-token', (err, decoded) => {
        if (err) {
            console.log(err);
                         if (err.name == 'TokenExpiredError') {// срок действия токена истек
                let str = {
                    iat:1,
                    exp:0,
                                         msg: "срок действия токена истек"
                }
                return str;
                         } else if (err.name == 'JsonWebTokenError') {// Неверный токен
                let str = {
                    iat:1,
                    exp:0,
                                         msg: 'Недействительный токен'
                }
                return str;
            }
        }else{
            return decoded;
        }
    })


    console.log(con);
    if(con.iat<con.exp){
                 return true // Время начала меньше времени окончания, что означает, что токен все еще действителен
    }else{
        return false
    }
}

Понравилась статья? Поделить с друзьями:
  • Ошибка средств компоновщика lnk2028
  • Ошибка средств компоновщика lnk2020
  • Ошибка средств компоновщика lnk2019 как решить
  • Ошибка средств компоновщика lnk2005
  • Ошибка средств компоновщика lnk1561