Как сделать аутентификацию на сайте через телеграм?

Ссылка скопирована
1 ответ

Привет. Объясняю в чем дело.
Читая подобные статьи "https://codex.so/telegram-auth" везде написано, что для аутентификации на моем сайте нужно использовать некий "виджет"

<script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="samplebot" data-size="large" data-onauth="onTelegramAuth(user)" data-request-access="write"></script> <script type="text/javascript">   function onTelegramAuth(user) {     alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')');   } </script>

<script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="samplebot" data-size="large" data-onauth="onTelegramAuth(user)" data-request-access="write"></script> <script type="text/javascript"> function onTelegramAuth(user) { alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')'); } </script>

Мне не сильно симпатизирует запихивать это в современное react приложение.

Хотелось бы сделать что-то типа обычного редиректа с get параметрами, например как в vk.
Может кто-то, знает какие-то другие способы реализации авторизации, спасибо.

мой стэк:
react
nestjs

Дополнительно:

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

  • Max Sagaidak, посмотрите на это с такой стороны:
    1) любому боту, который хочет как-то взаимодействовать с учёткой в Телеграм, необходимо, чтобы эта учётка предварительно добавила этот бот к себе,
    2) пункт первый не распространяется на боты самого Телеграм.
    Лично я из этого делаю вывод, что без виджета - никак. На vc.ru есть статья от чела, который якобы сделал свой виджет, но мне это кажется сомнительным
  • Михаил Ливач, Спасибо, я все таки дорыл нужное мне решение, сейчас распишу, сам для себя в будущем.
  • И так, для меня в будущем, и для тех кто это нагуглил:

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

    Интегрируем виджет в приложение react + ts:
    (это если вам надо что бы был не редирект, а вызов функции со стороны telegram)

    import { useEffect } from 'react' import { ITelegramUser } from '../../../../types/telegram/api-telegram-user.ts'  declare global {   interface Window {     onTelegramAuth: (user: ITelegramUser) => void   } }  export const ButtonTelegramAuth = () => {   useEffect(() => {     const button = document.createElement('script')     button.async = true     button.src = 'https://telegram.org/js/telegram-widget.js?22'     button.setAttribute('data-telegram-login', 'name_bot')     button.setAttribute('data-size', 'large')     button.setAttribute('data-radius', '20')     button.setAttribute('data-onauth', 'onTelegramAuth')      document.body.appendChild(button)      window.onTelegramAuth = function (user) {       alert(         'Logged in as ' +           user.first_name +           ' ' +           user.last_name +           ' (' +           user.id +           (user.username ? ', @' + user.username : '') +           ')'       )     }      return () => {       document.body.removeChild(button)     }   }, [])    return <div id="telegram-widget-container"></div> }

    import { useEffect } from 'react' import { ITelegramUser } from '../../../../types/telegram/api-telegram-user.ts' declare global { interface Window { onTelegramAuth: (user: ITelegramUser) => void } } export const ButtonTelegramAuth = () => { useEffect(() => { const button = document.createElement('script') button.async = true button.src = 'https://telegram.org/js/telegram-widget.js?22' button.setAttribute('data-telegram-login', 'name_bot') button.setAttribute('data-size', 'large') button.setAttribute('data-radius', '20') button.setAttribute('data-onauth', 'onTelegramAuth') document.body.appendChild(button) window.onTelegramAuth = function (user) { alert( 'Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')' ) } return () => { document.body.removeChild(button) } }, []) return <div id="telegram-widget-container"></div> }

    если нужен все таки редирект мы добавляем такое поле:

    script.setAttribute('data-auth-url', 'https://site.pw');

    script.setAttribute('data-auth-url', 'https://site.pw');

    и удаляем это:

    button.setAttribute('data-onauth', 'onTelegramAuth')  declare global {   interface Window {     onTelegramAuth: (user: ITelegramUser) => void   } }   window.onTelegramAuth = function (user) {       alert(         'Logged in as ' +           user.first_name +           ' ' +           user.last_name +           ' (' +           user.id +           (user.username ? ', @' + user.username : '') +           ')'       )     }

    button.setAttribute('data-onauth', 'onTelegramAuth') declare global { interface Window { onTelegramAuth: (user: ITelegramUser) => void } } window.onTelegramAuth = function (user) { alert( 'Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')' ) }

    И так объясняю в чем задумка:
    В ваше приложение react интегрируется все тот же виджет, но правильным образом. После нажатия на виджет происходит авторизация пользователя (он вводит свои данные / просто нажимает войти). Потом телеграм передает все его данные вам (в функцию - №1 способ / по get параметрам в url). Если вы делегируете
    регистрацию на сервер (а так правильно) то выбираете 2 способ. Сервер получает данные валидирует их и заносит в БД, затем делает редирект вашего пользователя к вам обратно на front, и заносит token (или что там еще не разобрался) в HttpOnly Ckookie. Ну а далее в моем случае Guard будет проверять есть этот token или нет, годен он или нет.

    Передаю привет Максиму в будущем. Как дела Макс ?

    Ответы:

    Здравствуй, Максим!
    А чтобы указать домен (/setdomain) в телеграме (@botfather) надо действующий домен указать, да?
    На локальном неполучится?
    На localhost:8080

    проект разрабатываю на Vue3 + TS

    выводит ошибку в телеграме Bot domain invalid
    Пробовал указызать через 192.168.0.111:8080 но, безтолку.

    • отвечу на свой вопрос.
      через ngrok туннель вывел свой домен на внешку и где домен в телеграме указал тот внешний домен который сгенерировал ngrok и все заработало. Ура!!
      Вывод такой, как я понял ошибка неизбежна если будете указать где домен через команду /setdomain localhost:8080 или как там запускаете свой проект, надо именно внешний домен.

      Передаю привет Калысу в будущем. Как дела Калыс? ))))

    • Kalys01, я просто купил сервер) первый раз слышу про "ngrok туннель"

    Помогите пожалуйста разобраться как его добавить, у меня не чего не отображается , в чем может быть проблема?
    import React, { useEffect } from 'react';

    const AuthTgButton = () => {
    useEffect(() => {
    const script = document.createElement('script');
    script.async = true;
    script.src = 'https://telegram.org/js/telegram-widget.js?22';
    script.setAttribute('data-telegram-login', 'casinoSpinSpritAuth_bot');
    script.setAttribute('data-size', 'large');
    script.setAttribute('data-userpic', 'false');
    script.setAttribute('data-auth-url', '13.60.53.138:8080');
    script.setAttribute('data-request-access', 'write');

    document.body.appendChild(script);

    return () => {
    document.body.removeChild(script);
    };
    }, []);

    return ;
    };

    export default AuthTgButton;

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Для реализации аутентификации на сайте через телеграм, вам понадобится использовать Telegram Bot API. Вот шаги, которые вам нужно выполнить:

    1. Создайте бота в Telegram. Для этого вам нужно обратиться к официальному боту BotFather и создать нового бота, следуя инструкциям. Получите токен вашего бота.

    2. Настройте Webhook для вашего бота. Это позволит вашему сайту получать обновления от Telegram. Для этого вам нужно отправить POST запрос на API Telegram с указанием URL вашего сайта, который будет принимать обновления.

    3. Настройте обработку запросов от Telegram на вашем сайте. Когда пользователь отправляет сообщение вашему боту, Telegram отправляет POST запрос на ваш сайт. Вам нужно обработать этот запрос, проверить данные и выполнить необходимые действия.

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

    Вот пример кода на PHP для обработки запросов от Telegram:

    <?php
    $token = "YOUR_BOT_TOKEN";
    $data = json_decode(file_get_contents("php://input"), true);
    if(isset($data["message"])) {
        $chat_id = $data["message"]["chat"]["id"];
        $text = $data["message"]["text"];
     
        // Далее вам нужно выполнить проверку данных и аутентифицировать пользователя
    }

    <?php $token = "YOUR_BOT_TOKEN"; $data = json_decode(file_get_contents("php://input"), true); if(isset($data["message"])) { $chat_id = $data["message"]["chat"]["id"]; $text = $data["message"]["text"]; // Далее вам нужно выполнить проверку данных и аутентифицировать пользователя }

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

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

    Вам также может быть интересно