Перейти к содержимому

Auth token expired telegram что делать

  • автор:

Работает ли telegram oauth в России?

AlekseyNemiro

spaceatmoon, от провайдера зависит, в клиенты уже завезли обход DPI и там, где он плохой, блокировка вообще не ощущается.

Решения вопроса 1

neatsoft

Life is too short for bad software

Telegram login widget в России не работает, но авторизация через Telegram элементарно реализуется с помощью бота. При отправке команды бот вызывает веб-хук, передавая имя пользователя, в ответ отправляется одноразовая ссылка для входа на сайт. Бота нужно запускать на зарубежном хостинге, т.к. с него должен быть доступен api.telegram.org, пользователь может находиться где угодно.

  1. Через @BotFather нужно создать нового бота, записать полученный token —
  2. Добавить команду /login с помощью /setcommands
  3. В консоли сгенерировать случайный uuid ( uuidgen -r ) —
  4. Настроить веб-хук (вместо httpie можно использовать curl, wget, или любую другую подобную утилиту):

http "https://api.telegram.org/bot/setWebhook?url=https:///bot//"
. TELEGRAM_BOT_ACCESS_TOKEN = TELEGRAM_BOT_WEBHOOK_TOKEN = TELEGRAM_BOT_OTP_TIMEOUT = 120 USE_X_FORWARDED_HOST = True CACHES = < 'default': < 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'django_cache', >> . 
. from .views import BotView, LoginView urlpatterns = [ . path('bot//', BotView.as_view()), path('login//', LoginView.as_view(), name='login'), ]
import json import requests import uuid from django.conf import settings from django.contrib.auth import login from django.contrib.auth.models import User from django.core.cache import cache from django.http import HttpResponse, HttpResponseNotFound, HttpResponseRedirect from django.urls import reverse from django.utils.decorators import method_decorator from django.views import View from django.views.decorators.csrf import csrf_exempt from django.views.generic import TemplateView . @method_decorator(csrf_exempt, name='dispatch') class BotView(View): def post(self, request, token): if str(token) != settings.TELEGRAM_BOT_WEBHOOK_TOKEN: return HttpResponseNotFound() params = json.loads(request.body) message = params['message'] if message.get('text') == '/login': user = message['from'] chat_id = user['id'] data = < 'username': user['username'], 'first_name': user.get('first_name', ''), 'last_name': user.get('last_name', ''), >otp = uuid.uuid4() cache.set(otp, data, settings.TELEGRAM_BOT_OTP_TIMEOUT) path = reverse('login', args=[otp]) login_url = request.build_absolute_uri(path) url = 'https://api.telegram.org/bot<>/sendMessage?chat_id=<>&text=<>'.format( settings.TELEGRAM_BOT_ACCESS_TOKEN, chat_id, login_url, ) requests.get(url, timeout=10) return HttpResponse('') class LoginView(TemplateView): template_name = 'login.html' def dispatch(self, request, otp): self.data = cache.get(otp, <>) return super().dispatch(request, otp) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['data'] = self.data return context def post(self, request, otp): cache.delete(otp) username = self.data.get('username') if not username: return HttpResponseRedirect(request.path) user, created = User.objects.update_or_create( username=username, defaults=< 'first_name': self.data.get('first_name', ''), 'last_name': self.data.get('last_name', ''), >, ) login(request, user) path = reverse('home') return HttpResponseRedirect(path)
   

This url invalid or expired.

Login as >

Альтернативная авторизация в Pyrogram через чат-бота Телеграм

Создаю юзербота на Pyrogram с управлением через чат-бота телеграм, который в свою очередь работает на PyTelegrambotApi. Создаю авторизацию через чат-бота, чтобы создавался файл сессии в Pyrogram. По сути пользователь вводит свой номер телефона чат-боту, потом код подтверждения, должен быть создан файл сессии. Добавил асинхронность, так как без неё не работает ничего. Теперь вылазит ошибка Telegram says: [400 PHONE_COED_EXPIRED] — The confirmation code has expired (caused by «auth.SignIn»).

import telebot import db import asyncio from telebot import types from pyrogram import Client bot = telebot.TeleBot('token') user_dict = <> class User: def __init__(self, id): self.id = id self.api_id = None self.api_hash = None self.number = None auth_dict = <> class Auth: def __init__(self, id): self.id = id self.number = None self.app = None self.sc = None self.loop = None self.code = None def sendcode(self, number): #async self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) self.app = Client(f"users//", api_id=apiid, api_hash='apihash') self.app.connect() self.number = number self.sc = Client.send_code(self.app, phone_number=self.number) self.app.disconnect() def signin(self, code): try: self.app.connect() except: pass print(self.sc.phone_code_hash) Client.sign_in(self.app, phone_number=self.number, phone_code_hash=self.sc.phone_code_hash, phone_code=str(self.code)) self.app.disconnect() self.loop.close() 

В самом боте Telegram я сначала спрашиваю у пользователя номер, потом вызываю функцию sendcode, затем через bot.register_next_step_handler получаю код и вызываю функцию signin

Отслеживать
задан 5 июн 2022 в 20:23
11 3 3 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

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

Проблемма в том, что хЭш кода авторизации можна использовать в текущем сеансе а у вас в функциях «sendcode» и «signin» приложение подключается и отключается между шагами авторизации и ето не подходит. По этому нужно избежать отключения пока не передастся код авторизации и не произойдёт вход в учётную запись. Наводку на суть проблеммы получил вот здесь

Сразу скажу, я нуб, только начал изучать питон и нашел только способ избежать отключение, сделав одну функцию (вместо 2х) и подерил её на 2 этапа с использованием переменной «menu» и её логической проверкой, чтобы ненужный код не выполнился в ненужный момент. И заранее извиняюсь за возможный баг в передачи номера телефона аккаунта на который происходит авторизация в переменную. Там можно на прямую прописать номер и оно точно заработает. (ну есть нуб)

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

Вот мой говнокод (да, я для бота использую тот же пирограм, но суть дела не меняет)(upd спустя сутки, перепроверил код, поправил, что бы не било ошибки, тысяча извиненй, скопировал не с того тестового файла):

import asyncio from pyrogram import Client, filters api_id = 00000000 api_hash = "xxxxxxxxxxxxxx" bot_token = "000000:xxxxxxxxxxx" menu = 0 phone_number = "" sc = None bot = Client("cp_bot", api_id=api_id, api_hash=api_hash, bot_token=bot_token) app = Client("test_auth", api_id=api_id, api_hash=api_hash, phone_number=phone_number) async def auth(number): global api_id global api_hash global phone_number global sc global menu global app loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) print(number) if menu == 1: await app.connect() print("trying send code") sc = await app.send_code(phone_number=number) print("OK") elif menu == 2: code = number ch = sc.phone_code_hash print(ch) await app.sign_in(phone_number=phone_number, phone_code_hash=ch, phone_code=str(code)) await app.disconnect() loop.close() @bot.on_message(filters.command(["start"]) & filters.text) async def command_start(client, message): global menu await message.reply_text("Старт аутентификации! Отправь номер телефона в международном формате (+1234567890)") menu = 1 @bot.on_message(filters.text) async def command_start(client, message): global menu global phone_number global code if menu == 1: phone = message.text phone = phone.replace("+", "") if phone.isdigit(): print(phone) phone_number = phone await auth(phone_number) menu = 2 print("is ok") await message.reply_text("DONE!\nТеперь отправь код авторизации, с цифрами через пробел (прим. \"1 2 266\" и подобное)") else: await message.reply_text("Phone incorrect! try again") elif menu == 2: v_dig = message.text v_dig = v_dig.replace(" ", "") # если в бота или личку ТГ с которого производится авторизация, пересылается # чистый код авторизации - он аннулируется, потому я использую лайфхак с вводом кода через пробел и он работает print(v_dig) if v_dig.isdigit(): code = v_dig print(code) await auth(code) await message.reply_text("DONE!\nАвторизация прошла успешно!") menu = 0 else: await message.reply_text("CODE incorrect! try again") bot.run() 

Авторизация пользователей через Telegram

Александр Менщиков

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

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

Настройка бота

Для использования виджета вам понадобится Telegram-бот.

Перейдите в чат с системным пользователем @botfather. Если у вас ещё нет ни одного бота, создайте его командой /newbot. Посмотреть список своих пользователей вы можете с помощью команды /mybots.

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

Here is the token for bot codex_cloud @codex_cloud_bot: 558<. >728:AWBEwgUg<. >HBKuiINt

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

Для каждого бота нужно привязать конкретный адрес сайта, на котором пользователи могут авторизоваться. В диалоге с @botfather введите команду /setdomain и напишите адрес сайта в виде http://ifmo.su.

Настройка виджета

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

Встраивание на сайт

Создайте файл index.php со следующим содержанием

После того, как пользователь нажмёт на кнопку, Telegram готов отправить вам данные любым из двух способов:

  • Отправить пользователя на ваш сайт путём редиректа, передав информацию о нём в GET параметрах.
  • Вызвать JavaScript функцию, передав в неё информацию о пользователе в качестве аргументов.

На данный момент поддерживаются следующие данные о пользователе:

  • id – уникальный идентификатор пользователя в Telegram
  • first_name, last_name – фамилия и имя из профиля пользователя
  • username – уникальное имя из профиля
  • photo_url – ссылка на аватарку пользователя в виде https://t.me/i/. /user.jpg
  • auth_date – дата авторазации
  • hash – HMAC-подпись ответа на основе секретного токена бота

Получение данных через JavaScript callback

Выберите в конструкторе виджета опцию Authorization Type: Callback. Сгенерированный в результате код виджета содержит JavaScript функцию, которая будет вызвана после успешной авторизации.

function onTelegramAuth(user) < alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')'); >

Эту функцию нужно передать в аттрибуте data-onauth тега

Вы можете произвольным образом реализовать функцию onTelegramAuth. Например, послать AJAX запрос на сервер с полученными аргументами.

Получение данных через Redirect

Выберите в конструкторе виджета опцию Authorization Type: Redirect to URL и введите URL, на который вы хотите получить запрос с данными пользователя. Например, введите адрес http://example.com/auth/telegram.

На странице обработки можно положить скрипт index.php следующего содержания:

Проверка данных пользователя

Чтобы удостовериться в правильности полученных данных, нужно проверить hash. Разработчики Telegram приводят пример кода проверки, добавим эту функцию в код из файла index.php

function checkTelegramAuthorization($auth_data) < $check_hash = $auth_data['hash']; unset($auth_data['hash']); $data_check_arr = []; foreach ($auth_data as $key =>$value) < $data_check_arr[] = $key . '=' . $value; >sort($data_check_arr); $data_check_string = implode(«\n», $data_check_arr); $secret_key = hash(‘sha256’, BOT_TOKEN, true); $hash = hash_hmac(‘sha256’, $data_check_string, $secret_key); if (strcmp($hash, $check_hash) !== 0) < throw new Exception('Data is NOT from Telegram'); >if ((time() — $auth_data[‘auth_date’]) > 86400) < throw new Exception('Data is outdated'); >return $auth_data; >

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

array(7) < ["id"]=>string(7) «1831337» [«first_name»]=> string(18) «Александр» [«last_name»]=> string(16) «Менщиков» [«username»]=> string(5) «n0str» [«photo_url»]=> string(36) «https://t.me/i/userpic/100/n0str.jpg» [«auth_date»]=> string(10) «1518168109» [«hash»]=> string(64) «abba<..>1345″ >

На первом шаге из массива извлекается значение по ключу hash и сохраняется в переменной.

На втором шаге массив преобразуется к виду key=value и сортируется в лексикографическом порядке. Полученные данные склеиваются в одну строку через разделитель “\n” (код символа – 0xA0).

Далее происходит проверка равенства HMAC-SHA-256 подписи этой строки и значения сохранённого hash. Дополнительно проверяется не устарела ли auth_date.

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

Авторизация пользователя на сайте

Добавим в файл код вызова функции проверки

if (isset($_GET[‘hash’])) < try < $auth_data = checkTelegramAuthorization($_GET); echo "Hello, " . $auth_data['username']; >catch (Exception $e) < die ($e->getMessage()); > >

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

Пример кода из рабочего проекта

try < $profile = $tg->checkTelegramAuthorization($_GET); $id = $profile[‘id’]; $user = Model_User::findByAttribute(‘telegram_id’, $id); if ($user->is_empty()) < $user = new Model_User(); $user->telegram_id = $id; . $user->save() > else < . >>

Кастомизация кнопки

Сейчас из-за ограничений iframe нельзя изменить внешний вид кнопки. Однако, если возникла сильная необходимость, можно обойти это ограничения с помощью clickjacking.

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

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

Итоги

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

Ссылки для подробного изучения

  • Официальная документация – https://core.telegram.org/widgets/login
  • Анонс виджета – https://telegram.org/blog/login
  • Документация по боту Telegram – https://core.telegram.org/bots#creating-a-new-bot
  • Примеры кода проверки авторизации – https://gist.github.com/anonymous/6516521b1fb3b464534fbc30ea3573c2

If you like this article, share a link with your friends

Read more

We talk about interesting technologies and share our experience of using them.

Что означает ошибка «CSRF токен истек»

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

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

Что такое CSRF

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

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

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

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

  1. Злоумышленник создаёт поддельную страницу, очень похожую на оригинальную, и встраивает её в сайт.
  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» (в переводе — срок действия токена истек). Сообщение может отображаться как на английском, так и на русском. Пример ошибки при авторизации на сайте Рег.ру:

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

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

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

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

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

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

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

в Google Chrome

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

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

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

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

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

20220125_chto_oznachayet_oshibka_csrf_token_istek_5.png

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

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

Заключение

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

Помогла ли вам статья?

Спасибо за оценку. Рады помочь ��

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

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