Авторизация/Регистрация пользователя через Telegram

В данном топике хочу описать дополнительный, а для некоторых сервисов возможно и основной способ авторизации и регистрации пользователя через Telegram, подобно OAuth авторизации через социальные сети и web-сервисы.

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

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

Теперь что касается серверной стороны.

На странице приложений Telegram есть не официальное приложение telegram-cli. Оно и будет выполнять функцию приложения которое будет взаимодействовать с сервером Telegram.

Для упрощения примера telegram-cli будем ставить в каталог /usr/local/src/:
cd /usr/local/src/


Клонируем репозиторий:
git clone --recursive https://github.com/vysheng/tg.git && cd tg

Ставим необходимые пакеты:
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev python-dev

Собираем telegram-cli:
./configure make

При первом запуске, приложение попросит ввести номер телефона нашего «живого» аккаунта. После ввода номера, будет выслан код подтверждения по смс или в приложение если данный аккаунт сейчас активен на другом устройстве. После подтверждения, в вашем домашнем каталоге будет создана директория ".telegram-cli" в которой будут хранится файлы конфигураций для указанного аккаунта.

Запускаем:
/usr/local/src/tg/bin/telegram-cli -k /usr/local/src/tg/tg-server.pub

Видим следующую картину:
image

Выходим из приложения:
quit

Запускаем приложение как демон например на порту 8089:
/usr/local/src/tg/bin/telegram-cli --json -k /usr/local/src/tg/tg-server.pub -W -d -P 8089 &

Теперь нам необходим скрипт который будет взаимодействовать с telegram-cli.

По ключевым словам(telegram-cli php client) на GitHub было найдено готовое решение на PHP.

Установка:
git clone https://github.com/zyberspace/php-telegram-cli-client
cd php-telegram-cli-client
curl -sS https://getcomposer.org/installer | php
php composer.phar install

Создаем файл tg.php со следующим содержанием:
<?php

	require('vendor/autoload.php');
	$telegram = new \Zyberspace\Telegram\Cli\Client('tcp://localhost:8089');

	$USERNAME = '';

	if($user = $telegram->exec("resolve_username {$USERNAME}")){

		if($user->type == 'user'){

			$code = mt_rand(10000, 99999);
			$message = "Hi {$user->first_name}! Your code: {$code}";
			if($telegram->exec("msg user#{$user->id} {$message}")){
				echo "Send message: Success\r\n";
			} else {
				echo "Send message: Error\r\n";
			}
		}

	} else {
		echo "User {$USERNAME} not found.\r\n";
	}

В переменную $USERNAME вписываем username пользователя которому будет отправлено сообщение с кодом подтверждения.

Запускаем скрипт:
php tg.php
Если все прошло успешно, пользователю будет отправлено сообщение с кодом.

На базе данного примера можно легко реализовать регистрацию/авторизацию пользователей через Telegram.

Спасибо за внимание!
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 12

    0
    Мне кажется быстро забанят такой аккаунт.
      0
      Да вроде бы и не запрещено это явно: core.telegram.org/api/terms-of-use

      Хотя…

      In case you want a real Terms of Use, complete with lawyer-speak and all — we don't have that yet, sorry. But we may be adding it in the future.
        0
        Будет выглядеть очень странно, если один контакт пишет многим людям, а ему никто не отвечает.
      +4
      Очень плохой пример авторизации на базе Telegram.

      Правильное решение — использовать Telegram Bots API. Он был создан как раз для подобных задач.

      Автор явно не обратил внимание на раздел про Deep Linking. Этот механизм позволяет пользователю одним кликом на внешнем сайте открыть переписку с ботом в Telegram с передачей произвольного параметра.

      Во-первых с точки зрения usability пользователю куда проще нажать на одну кнопку на сайте, чтобы перейти в Telegram сразу в нужное место.

      Во-вторых подобный псевдо-пользователь, пишущий случайным пользователям первым, используя их username, для Telegram ничем не отличается от спам-бота, и следовательно, наверняка будет заблокирован.
        0
        Читал про этот Deep Linking. Действительно можно легко передать данные боту. Например даешь ссылку на
        telegram.me/TheBot?start=QQ

        А в боте получаешь:
        {
           "result" : [
              {
                 "message" : {
                    "text" : "/start QQ",     //    <--------
                    "date" : 1438985300,
                    "message_id" : 16,
                    "from" : {
                       "first_name" : "Habra",
                       "id" : 110304546,
                       "last_name" : "User"
                    },
                    "chat" : {
                       "id" : 110304546,
                       "first_name" : "Habra",
                       "last_name" : "User"
                    }
                 },
                 "update_id" : 10336636
              }
           ],
           "ok" : true
        }
        


        Вопрос: можно ли открыть эту сессию в отдельном окне чата?
          0
          Что имеется ввиду под отдельным окном? У пользователя может быть установлен любой из клиентов, в т.ч. нативный.
            0
            Отдельный чат с уникальным id и только своей историей.

            Как именно это будет оформлено — отдельное окно, вкладки в браузере или будет какой-то особый способ выбора этого чата — не имеет значения.
            Если я правильно понимаю, на уровне протокола это поддерживается — у каждого чата есть chat_id. Если общаешься с одним пользователем, то этот id совпадает с id пользователя, если группа — то у нее свой id.
            Все, что нужно сделать — разрешить открывать отдельный чат.
              0
              Нет, такой возможности не предусмотрено и вряд ли стоит её ожидать в ближайшем будущем.
                0
                Вот это и странно. Потому что по сути все нужное для этого уже сделано.
                Почему считаете, что не следует ожидать?
                Думаю, это была бы полезная фича.
          0
          На storebot.me так реализована авторизация через deep linking.
        +1
        у storebot.me — стора для ботов сделана авторизация через бота. в принципе придя с токеном в чат и получив в ответ chatid или username пользователя можно авторизовать. хотя конечно это экзотика имхо.

        Only users with full accounts can post comments. Log in, please.