ichinya / laravel-socialite
Socialite for Laravel
Fund package maintenance!
Requires
- php: ^8.3|8.4|8.5
- laravel/framework: ^12.25|^13.1
- laravel/socialite: *
Requires (Dev)
- laravel/pint: ^1.29
- orchestra/testbench: ^11.1
- pestphp/pest: ^5.0
- pestphp/pest-plugin-laravel: ^5.0
- phpstan/phpstan: ^2.1
README
Пакет добавляет готовый OAuth-вход для Laravel через laravel/socialite:
- маршруты
/socialite/{driver}/redirectи/socialite/{driver}/callback; - таблицу
social_accountsдля привязки провайдера к пользователю; - автоматическую авторизацию существующего пользователя или создание нового;
- привязку дополнительного провайдера для уже авторизованного пользователя;
- generic hook для кастомного redirect screen без правки vendor-кода.
Требования
- PHP
^8.3|8.4|8.5 - Laravel
^12.25|^13.1 laravel/socialite
Установка
composer require ichinya/laravel-socialite php artisan vendor:publish --tag=ichinya-socialite php artisan migrate
Как работает flow
- Гость переходит на
socialite.redirect. - Пакет создаёт provider через
Socialite::driver($driver). - Если для драйвера настроен
redirect_hooks, пакет даёт hook-классу шанс вернуть кастомный response. - Если hook не настроен, вернул
null, сконфигурирован неверно или завершился ошибкой, пакет делает fallback к штатному provider response. - На callback пакет связывает
driver + identityс пользователем и выполняет login/bind flow.
Локальная разработка пакета через path repository
Если пакет разрабатывается локально внутри Laravel-приложения:
composer config repositories.ichinya-laravel-socialite path packages/ichinya/laravel-socialite composer update ichinya/laravel-socialite composer show ichinya/laravel-socialite
Ожидаемый результат проверки: dist: [path] packages/ichinya/laravel-socialite.
Чтобы вернуться к обычной версии из registry:
composer config --unset repositories.ichinya-laravel-socialite composer update ichinya/laravel-socialite
Настройка config/socialite.php
<?php return [ 'drivers' => [ 'github' => '/assets/socialite/github.svg', 'google' => '/assets/socialite/google.svg', 'telegram' => '/assets/socialite/telegram.svg', ], 'redirect_hooks' => [ 'telegram' => \App\Infrastructure\Auth\TelegramRedirectScreen::class, ], 'stateless_drivers' => [ 'telegram' => true, ], 'redirects' => [ 'after_login' => '/cabinet', 'after_bind' => '/cabinet', 'on_error' => 'route:login', ], ];
Ключи конфига
drivers: активные провайдеры в форматеdriver => icon_path.redirect_hooks: картаdriver => class-stringдля container-resolved hook-классов.stateless_drivers: драйверы, для которых нужно->stateless().redirects.after_login: редирект после login flow.redirects.after_bind: редирект после bind flow.redirects.on_error: редирект при ошибке OAuth. Поддерживает путь иroute:<name>.
Generic redirect hook
Hook нужен для custom redirect screen, когда provider на этапе redirect() отдаёт HTML, legacy widget или другой нестандартный ответ, а приложению нужен собственный wrapper screen.
Hook-класс должен реализовывать Ichinya\LaravelSocialite\Contracts\RedirectHook:
<?php namespace App\Infrastructure\Auth; use Closure; use Ichinya\LaravelSocialite\Contracts\RedirectHook; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response; use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirectResponse; class TelegramRedirectScreen implements RedirectHook { public function handle( string $driver, mixed $provider, Closure $fallback, ): RedirectResponse|Response|SymfonyRedirectResponse|string|null { if ($driver !== 'telegram' || !method_exists($provider, 'getButton')) { return null; } return response('<html>custom wrapper screen</html>'); } }
Hook получает lazy callback $fallback, если приложению нужно вручную вернуть исходный provider response без преждевременного вызова redirect().
Что может вернуть hook
Illuminate\Http\ResponseIlluminate\Http\RedirectResponseSymfony\Component\HttpFoundation\RedirectResponsestringnull
Fallback semantics
- hook не настроен: пакет ведёт себя как раньше;
- hook сконфигурирован на несуществующий класс или класс с неверным контрактом: ошибка логируется, затем выполняется fallback;
- hook вернул
null: используется штатный provider response; - hook выбросил исключение: ошибка логируется, затем выполняется fallback;
- hook не должен заменять callback/login flow, он влияет только на этап
redirect.
Диагностика
В логах ищите:
DEBUGна resolve hook поdriver;DEBUGна fallback послеnull;WARNна отсутствующий hook-класс;ERRORна exception внутри hook или ошибке container resolution;INFOна successful custom response.
Настройка config/services.php и .env
Google / GitHub
'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], 'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), 'client_secret' => env('GITHUB_CLIENT_SECRET'), 'redirect' => env('GITHUB_REDIRECT_URI'), ],
GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= GOOGLE_REDIRECT_URI="${APP_URL}/socialite/google/callback" GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= GITHUB_REDIRECT_URI="${APP_URL}/socialite/github/callback"
Telegram
Для Telegram нужен socialiteproviders/telegram.
composer require socialiteproviders/telegram
'telegram' => [ 'bot' => env('TELEGRAM_LOGIN_BOT_NAME', env('TELEGRAM_BOT_NAME')), 'client_id' => null, 'client_secret' => env('TELEGRAM_BOT_TOKEN'), 'redirect' => env('TELEGRAM_LOGIN_REDIRECT_URI', env('APP_URL').'/socialite/telegram/callback'), ],
TELEGRAM_LOGIN_BOT_NAME=your_bot_name TELEGRAM_BOT_TOKEN=your_bot_token TELEGRAM_LOGIN_REDIRECT_URI="${APP_URL}/socialite/telegram/callback"
Пример регистрации Telegram provider:
use Illuminate\Support\Facades\Event; use SocialiteProviders\Manager\SocialiteWasCalled; use SocialiteProviders\Telegram\Provider as TelegramProvider; Event::listen(function (SocialiteWasCalled $event): void { $event->extendSocialite('telegram', TelegramProvider::class); });
Связь в модели User
use Ichinya\LaravelSocialite\Traits\HasSocialites; class User extends Authenticatable { use HasSocialites; }
После этого доступна связь:
$user->socials;
Маршруты пакета
GET /socialite/{driver}/redirect(socialite.redirect)GET /socialite/{driver}/callback(socialite.callback)
Обработка ошибок на login screen
При ошибке OAuth пакет редиректит на socialite.redirects.on_error и кладёт текст ошибки в ключ socialite.
@if($errors->has('socialite')) <div>{{ $errors->first('socialite') }}</div> @endif
Частые проблемы
Invalid state
Добавьте драйвер в stateless_drivers:
'stateless_drivers' => [ 'telegram' => true, ],
Bot username required
Проверьте services.telegram.bot и TELEGRAM_LOGIN_BOT_NAME.
Mixed Content
Проверьте:
APP_URL=https://...- доверие к proxy-заголовкам в Laravel и веб-сервере.
Changelog
Смотрите CHANGELOG.md.
License
MIT. See LICENSE.md.