Resumen
revolution/socialite-discord es un paquete driver que permite usar la autenticación OAuth2 de Discord con Laravel Socialite.
Los proveedores integrados de Laravel Socialite no incluyen Discord. Instalando este paquete puedes añadir el inicio de sesión con Discord a tu aplicación usando Socialite::driver('discord').
Instalación
composer require revolution/socialite-discord
Configuración
Registra una aplicación en el Discord Developer Portal
Crea una aplicación en el Discord Developer Portal y obtén el Client ID y el Client Secret en la sección OAuth2. Añade la URL de callback (por ejemplo, https://example.com/auth/discord/callback) en Redirects.
config/services.php
'discord' => [
'client_id' => env('DISCORD_CLIENT_ID'),
'client_secret' => env('DISCORD_CLIENT_SECRET'),
'redirect' => env('DISCORD_REDIRECT'),
],
.env
DISCORD_CLIENT_ID=your-client-id
DISCORD_CLIENT_SECRET=your-client-secret
DISCORD_REDIRECT=https://example.com/auth/discord/callback
Uso básico
Define las rutas
Añade dos rutas a routes/web.php: una para la redirección y otra para el callback.use App\Http\Controllers\SocialiteController;
Route::get('auth/discord', [SocialiteController::class, 'login']);
Route::get('auth/discord/callback', [SocialiteController::class, 'callback']);
Crea el controlador
<?php
namespace App\Http\Controllers;
use Laravel\Socialite\Facades\Socialite;
class SocialiteController extends Controller
{
public function login()
{
return Socialite::driver('discord')->redirect();
}
public function callback()
{
$discordUser = Socialite::driver('discord')->user();
// $discordUser->getId() ID de usuario de Discord
// $discordUser->getName() Nombre de usuario
// $discordUser->getEmail() Dirección de correo (requiere el scope email)
// $discordUser->getAvatar() URL del avatar
// $discordUser->token Token de acceso
$user = \App\Models\User::updateOrCreate(
['discord_id' => $discordUser->getId()],
['name' => $discordUser->getName()]
);
\Illuminate\Support\Facades\Auth::login($user);
return redirect('/dashboard');
}
}
Configuración de scopes
En Discord OAuth2 los permisos que quieres obtener se indican como scopes. El scope por defecto es solo identify.
public function login()
{
return Socialite::driver('discord')
->setScopes(['identify', 'email', 'guilds', 'guilds.join'])
->redirect();
}
Lista de scopes principales:
| Scope | Información que obtienes |
|---|
identify | ID de usuario, nombre de usuario, avatar (por defecto) |
email | Dirección de correo |
guilds | Lista de servidores a los que pertenece |
guilds.join | Permiso para añadir al usuario a un servidor |
Guardar y autenticar al usuario
Ejemplo típico en la ruta de callback: obtén la información del usuario, guárdala en la base de datos e inicia sesión.
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
public function callback()
{
$discordUser = Socialite::driver('discord')->user();
$user = User::updateOrCreate(
['discord_id' => $discordUser->getId()],
[
'name' => $discordUser->getName(),
'email' => $discordUser->getEmail(),
'discord_token' => $discordUser->token,
]
);
Auth::login($user);
return redirect('/dashboard');
}
Para obtener email necesitas el scope email. Si no lo especificas, getEmail() puede devolver null.
Comparación con otros drivers de Socialite
Este paquete está implementado por la vía oficial Socialite::extend() y se usa exactamente con la misma API que los proveedores integrados. Para más detalles sobre el mecanismo de los proveedores personalizados y Socialite::extend(), consulta la guía de Socialite.