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 にリダイレクト用とコールバック用の2つのルートを追加します。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 ガイド を参照してください。