BotAuth — пакет, который позволяет реализовать вход при помощи бота Вконтакте, FaceBook, Telegram.
Основная задача BotAuth, упростить посетителям Веб сайтов/PWA вход через социальные сети.
Пока соц. сети не реализуют обратную связь нативных мобильных приложений с веб сайтом, разработчикам приходится отправлять пользователя в браузер, где снова нужно вводить логин и пароль.
Используя ботов, можно получить обратную связь (callback) из нативного приложения, тем самым не заставлять вводить логин и пароль соц. сети в браузере.
Demo — https://laravel.zetrider.ru/botauth
GitHub — https://github.com/zetrider/BotAuth
Ссылки вида:
https://vk.me/ https://t.me/ https://m.me/
откроют мобильное приложение для начала диалога с ботом. Посетителю не придется повторно вводить логин и пароль в браузере.
Вы можете подключить ботов:
- Вконтакте
- Telegram
- Ваш собственный провайдер (пример ниже)
Установка
- composer require zetrider/botauth
- Подключить пакет в config/app.php
Провайдер
ZetRider\BotAuth\BotAuthServiceProvider::class,
Фасад
'BotAuth' => ZetRider\BotAuth\Facades\BotAuth::class,
- Скопировать конфиг. файл
php artisan vendor:publish --tag=botauth-config
при необходимости
php artisan vendor:publish --tag=botauth-views
php artisan vendor:publish --tag=botauth-migrations
- Указать для нужных соц. сетей ссылку в config/botauth.php в параметре link.
- Заполнить ENV файл ключами ботов
BOTAUTH_VKONTAKTE_API_SECRET BOTAUTH_VKONTAKTE_API_TOKEN BOTAUTH_VKONTAKTE_API_CONFIRM BOTAUTH_TELEGRAM_API_TOKEN BOTAUTH_TELEGRAM_PROXY BOTAUTH_FACEBOOK_API_SECRET BOTAUTH_FACEBOOK_API_TOKEN BOTAUTH_FACEBOOK_API_CONFIRM
- Запустить миграции
php artisan migrate
- В Middleware VerifyCsrfToken добавить исключение адреса для callback, по умолчанию botauth/callback/*'
protected $except = [ 'botauth/callback/*' // Except callback Csrf middleware ];
- Для вашей модели User добавьте трейт:
use ZetRider\BotAuth\Traits\BotAuthUserTrait;
который добавит отношение с логинами пользователя из соц. сетей
Подключение ботов:
Вконтакте
Бот готов к работе.
Пример прямой ссылки на диалог с ботом
- Откройте настройки своего сообщества или создайте новое vk.com/groups?w=groups_create
- В настройках сообщества откройте райздел «Настройки» — «Работа с API»
- Создайте ключ доступа, выберите пункт «Разрешить приложению доступ к сообщениям сообщества», запишите ключ, его нужно указать в .env BOTAUTH_VKONTAKTE_API_TOKEN
- На той же странице выберите Callback API, выберите «Версия API» 5.95, укажите в поле «Адрес» callback адрес вашего сайта, пример по умолчанию
https://DOMAIN/botauth/callback/vkontakte
- Ниже укажите строку, которую должен вернуть сервер в .env BOTAUTH_VKONTAKTE_API_CONFIRM
- В поле «Секретный ключ» придумайте любой секретный ключ, укажите в .env BOTAUTH_VKONTAKTE_API_SECRET
- После заполнения всех ключей в .env нажмите кнопку «Подтверидть»
- На этой же странице откройте вкладку «Типы событий», нужно выбрать «Входящие сообщения»
- Откройте натсройки сообщества, пункт «Сообщения», включите «сообщения сообщества»
- Откройте настройки сообщества, пункт «Сообщения» — «Настройки для бота», включите «Возможности ботов»
Бот готов к работе.
Пример прямой ссылки на диалог с ботом
https://vk.me/zetcode
Telegram
Бот готов к работе.
Пример прямой ссылки на диалог с ботом
- Создайте своего бота через @BotFather
- Запомните ключ, укажите в .env BOTAUTH_TELEGRAM_API_TOKEN
- Добавьте веб хук через
https://api.telegram.org/botYOUR_TOKEN/setWebhook?url=https://DOMAIN/botauth/callback/telegram
замените YOUR_TOKEN на ваш токен, DOMAIN на ваш домен - При необходимости укажите прокси в .env BOTAUTH_TELEGRAM_PROXY, например socks5h://127.0.0.1:1080
Бот готов к работе.
Пример прямой ссылки на диалог с ботом
https://t.me/BotAuthBot
Facebook
Бот уже готов к работе, но доступен только для администраторов.
После подтверждения приложения, он станет доступен для всех посетителей. Отправьте приложение на модерацию.
Пример прямой ссылки на диалог с ботом
- У вас должна быть создана страница, если ее нет, добавьте www.facebook.com/pages/creation/?ref_type=universal_creation_hub
- Добвьте новое приложение developers.facebook.com/apps
- В настройках приложение выберите «Основное», скопируйте «Секрет приложения» в .env BOTAUTH_FACEBOOK_API_SECRET
- В настройках приложение нужно добавить продукт «Messenger»
- В настройках продукта «Messenger» создайте токен доступа, укажите его в .env BOTAUTH_FACEBOOK_API_TOKEN
- В настройках продукта «Messenger» создайте веб хук, в URL обратного вызова укажите
замените DOMAIN на ваш доменhttps://DOMAIN/botauth/callback/facebook
- В поле «Подтвердите маркер» укажите произвольный текст, сохраните в .env BOTAUTH_FACEBOOK_API_CONFIRM
- В опциях «Поля подписки» выберите «messages»
- Нажмите «Подтвердить»
- После подтверждения сервера в настройках веб хуков выберите страницу, нажмите «Подписаться»
- В окне «Проверка приложения Messenger» рядом с пунктом «pages_messaging» нажмите «Добавить к заявке»
Бот уже готов к работе, но доступен только для администраторов.
После подтверждения приложения, он станет доступен для всех посетителей. Отправьте приложение на модерацию.
Пример прямой ссылки на диалог с ботом
https://m.me/zetridercode
Важно:
- Сайт должен работать по https
- Facebook бот возвращает PSID, который не соответствует публичному ID пользователя.
- По умолчанию контроллер бота работает с моделью \App\User. Если у вас другой случай, просто создайте свой контроллер и модель на основе примеров из репозитория. Модель, Контроллер
Как добавить свой провайдер:
Создайте свой класс, который наследует абстрактный класс
ZetRider\BotAuth\AbstractProvider
Пример example/ExampleProvider.php
Добавьте в сервис провайдер, например AppServiceProvider в методе boot
// Register example proider
BotAuth::extend('example', function() {
return new \Path\To\Your\Class\ExampleProvider();
});
Провайдер будет обрабатывать запросы в callback по адресу
https://.../botauth/callback/example
События
Событие при успешной обработке нового сообщения от бота
// Catch bot callback
\Event::listen(\ZetRider\BotAuth\Events\MessageNewEvent::class, function($event)
{
$provider = $event->provider; // ZetRider\BotAuth\AbstractProvider
$slug = $provider->getProviderSlug();
$data = $provider->getCallbackResponse();
$user = $provider->getUser();
$text = $provider->getText();
// You can send a message
// $provider->sendMessage(__('Back to web site'));
});