Как реализовать авторизацию через Telegram на php?

432
18 сентября 2017, 04:52

Мне нужно реализовать авторизацию пользователей через telegram на моем сайте. Подскажите, как это можно сделать. В документации Telegram Api вообще не мог разобраться. В интернете одни мануалу по созданию ботов. Если можно, пожалуйста, напишите на php или хотя бы ссылки на ресурсы по этой теме.

Answer 1

На сайте уже есть авторизация? какова структура сайта? Есл не ошибаюсь, официальной oauth2 авторизации через Телеграм нет. Наиболее простой вариант - авторизировать через бота. Пользователь может начать чат с ботом по ссылке, передав дополнительные параметры. На стороне сайта вы просто можете сохранять в базу всех, кто постучит боту. За счет параметров в ссылке можно точно определить что пользователь пришел с сайта и проверять актуальность ключа. В качестве логина можно использовать ID телеграма, высылать пароль при регистрации или восстановлении.

Этот называется Deep linking и описано в официальной документации.

Вот минимальный пример кода из некогда рабочего бота.

<?php
// Telegram URL, token, API url
define('TOKEN', '***BOT_TOKEN***');
define('URL', 'https://api.telegram.org/bot'.TOKEN.'/');
// Bot input
$input = json_decode(file_get_contents('php://input'), true);
// User data
$chat_id = $input['message']['chat']['id'];
$username = $input['message']['from']['username'];
$full_name = $input['message']['from']['last_name'].' '.$input['message']['from']['first_name'];
$date = $input['message']['date'];
$text = $input['message']['text'];
// User auth
if ( explode( ' ', $text )[1] == SITE_TOKEN ){
  $user = $DB->select( 'users', $chat_id );
  if ( !$user ){
    $userPassword = generatePassword();
    $DB->insert( 'users', makeUser( $chat, $userPassword, $full_name, $date ) );
    send_keyb(
      $chat,
      "Добро пожаловать, {$full_name}. Вы зарегистрированы как {$username}!
      Пароль для доступа к сайту: {$userPassword}",
      mainMenu()
    );
  }
  else {
    send_keyb(
      $chat,
      "Вы уже зарегистрированы как {$username}!
      Чтобы восстановить пароль, нажмите: /forot_password",
      mainMenu()
    );
  }
}
?>

Формат данных от пользователя при переходе по ссылке:

https://telegram.me/your_site_bot?start=2a79RhELHUoC5stlOqI6pnz1bTmjuFMWSdye8xKZi4XcG0VNrJPBA3gfQDwkYv

{"update_id":000000000,"message":{"message_id":0000,
"from":{"id":000000000,"is_bot":false,"first_name":"FIRST_NAME","username":"USERNAME","language_code":"en-US"},
"chat":{"id":000000000,"FIRST_NAME":"#","username":"USERNAME","type":"private"}, "date":1505645689,
/// USER TOKEN FROM SITE
"text":"/start 2a79RhELHUoC5stlOqI6pnz1bTmjuFMWSdye8xKZi4XcG0VNrJPBA3gfQDwkYv",
"entities":[{"offset":0,"length":6,"type":"bot_command"}]}}

так же есть реально рабочий пример на github.com

READ ALSO
Как сохранить данные по порядку в json файл?

Как сохранить данные по порядку в json файл?

Заказывал парсер, мне его написали, все здорово, спарсенное сохраняется в json базу и выводится на сайте

171
Вывести новости с названиями категорий

Вывести новости с названиями категорий

Поставил себе задачку по php и mysql вывести список новостей и название категорий, к которым относятся эти самые новости

162
Как Ускорить Запрос к БД?

Как Ускорить Запрос к БД?

У меня есть таблица на 30500 записейВ ней находятся города, районы, и всякие населенные пункты

165
Как прописать ссылку в htaccess?

Как прописать ссылку в htaccess?

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

191