revolution/socialite-discord는 Discord OAuth2 인증을 Laravel Socialite에서 사용할 수 있도록 하는 드라이버 패키지입니다.
Laravel Socialite의 기본 제공 프로바이더에는 Discord가 포함되어 있지 않습니다. 이 패키지만 설치하면 Socialite::driver('discord')를 사용한 Discord 로그인을 앱에 추가할 수 있습니다.
composer require revolution/socialite-discord
Discord Developer Portal에서 앱 등록
Discord Developer Portal에서 애플리케이션을 생성하고 OAuth2 섹션에서 Client ID와 Client Secret을 획득합니다. Redirects에 콜백 URL (예: https://example.com/auth/discord/callback)을 추가하세요.
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
기본적인 사용법
라우트 정의
routes/web.php에 리다이렉트용과 콜백용 두 라우트를 추가합니다.use App\Http\Controllers\SocialiteController;
Route::get('auth/discord', [SocialiteController::class, 'login']);
Route::get('auth/discord/callback', [SocialiteController::class, 'callback']);
컨트롤러 생성
<?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() Discord 사용자 ID
// $discordUser->getName() 사용자 이름
// $discordUser->getEmail() 이메일 주소 (email 스코프 필요)
// $discordUser->getAvatar() 아바타 URL
// $discordUser->token 액세스 토큰
$user = \App\Models\User::updateOrCreate(
['discord_id' => $discordUser->getId()],
['name' => $discordUser->getName()]
);
\Illuminate\Support\Facades\Auth::login($user);
return redirect('/dashboard');
}
}
스코프 설정
Discord OAuth2에서는 획득할 권한을 스코프로 지정합니다. 기본 스코프는 identify만입니다.
public function login()
{
return Socialite::driver('discord')
->setScopes(['identify', 'email', 'guilds', 'guilds.join'])
->redirect();
}
주요 스코프 목록:
| 스코프 | 획득 가능한 정보 |
|---|
identify | 사용자 ID, 사용자 이름, 아바타 (기본) |
email | 이메일 주소 |
guilds | 참가 중인 서버 목록 |
guilds.join | 사용자를 서버에 추가하는 권한 |
사용자 저장과 로그인
콜백 라우트에서 사용자 정보를 획득하고, 데이터베이스에 저장한 뒤 로그인하는 전형적인 구현 예입니다.
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');
}
email을 획득하려면 email 스코프가 필요합니다. 스코프를 지정하지 않는 경우 getEmail()은 null을 반환할 수 있습니다.
다른 Socialite 드라이버와의 비교
이 패키지는 Socialite::extend()를 사용한 정규 방식으로 구현되어 있으며, 기본 제공 프로바이더와 완전히 동일한 API로 사용할 수 있습니다. 커스텀 프로바이더의 구조와 Socialite::extend()의 자세한 내용은 Socialite 가이드를 참조하세요.