Installation
composer require baks-dev/auth-telegram
php bin/console baks:assets:install
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Verify the package is registered in config/packages/baks_auth_telegram.yaml.
Configure Telegram Bot
Add your bot token and allowed domains to .env:
TELEGRAM_BOT_TOKEN=your_bot_token_here
TELEGRAM_ALLOWED_DOMAINS=yourdomain.com,subdomain.yourdomain.com
First Use Case: Login Button
Add the login button to your Symfony template (e.g., base.html.twig):
<a href="{{ path('baks_auth_telegram_login') }}" class="telegram-login-btn">
Login with Telegram
</a>
The route baks_auth_telegram_login triggers the OAuth flow.
OAuth Flow
code parameter.code for a Telegram User object (via baks-dev/telegram-bot).User Model Integration
Extend your User entity to include Telegram-specific fields:
// src/Entity/User.php
use Baks\AuthTelegram\Entity\TelegramUser;
#[ORM\Embedded(class: TelegramUser::class)]
private TelegramUser $telegram;
The package provides a TelegramUser embeddable for storing:
telegramId (int)username (string|null)firstName (string)lastName (string|null)authDate (DateTimeImmutable)Guard Integration
Configure the guard in config/packages/security.yaml:
firewalls:
main:
telegram_authenticator: true # Enables the TelegramAuthenticator
Customizing User Resolution Override the default user resolver (e.g., to merge Telegram data with existing users):
// config/packages/baks_auth_telegram.yaml
baks_auth_telegram:
user_resolver: App\Security\CustomTelegramUserResolver
Implement Baks\AuthTelegram\Resolver\UserResolverInterface.
form_login firewall is properly configured.telegram_bot service tag to register multiple bots:
services:
App\Telegram\CustomBot:
tags: ['baks.telegram.bot']
baks-dev/telegram-bot.php bin/phpunit --group=auth-telegram
Database Schema Mismatch
telegram_user table or an embedded TelegramUser in your User entity.CORS Issues
.env (TELEGRAM_ALLOWED_DOMAINS).TELEGRAM_ALLOWED_DOMAINS=localhost,127.0.0.1,yourdomain.com
Bot Token Validation
Telegram API error: Bad Request: token invalid
User Merge Conflicts
telegramId, the package may create a duplicate.UserResolver to merge users by email/username.PHP 8.4+ Requirements
Enable Verbose Logging
Add to config/packages/dev/baks_auth_telegram.yaml:
baks_auth_telegram:
debug: true
Logs OAuth flow details to var/log/dev.log.
Inspect the Telegram User Object Dump the resolved user in a controller:
use Baks\AuthTelegram\Resolver\UserResolverInterface;
public function debugTelegramUser(UserResolverInterface $resolver): void
{
$user = $resolver->resolve(new TelegramUser($telegramId));
dump($user);
}
Test Locally with ngrok
If testing on localhost, expose your app via ngrok:
ngrok http 8000
Update TELEGRAM_ALLOWED_DOMAINS to include the ngrok URL (e.g., your-ngrok-url.ngrok.io).
Custom User Attributes
Extend the TelegramUser embeddable:
#[ORM\Embeddable]
class CustomTelegramUser extends TelegramUser
{
#[ORM\Column(nullable: true)]
private ?string $languageCode = null;
}
Post-Auth Actions
Listen to the telegram_auth_success event:
// src/EventListener/TelegramAuthListener.php
use Baks\AuthTelegram\Event\TelegramAuthSuccessEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(TelegramAuthSuccessEvent::class)]
public function onTelegramAuth(TelegramAuthSuccessEvent $event): void
{
$user = $event->getUser();
// Send welcome email, log activity, etc.
}
Rate Limiting Add rate limiting to the OAuth endpoint:
# config/packages/security.yaml
firewalls:
main:
telegram_authenticator: true
pattern: ^/telegram/login
limiter: { max: 5, interval: '1 minute' }
Two-Factor Authentication (2FA) Combine with Symfony’s 2FA bundle:
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
public function getPassport(): Passport
{
return new Passport(
new UserBadge($this->telegramId, function () use ($telegramId) {
return $this->userResolver->resolve($telegramId);
}),
new TotpBadge('telegram_2fa') // Add 2FA
);
}
How can I help you explore Laravel packages today?