revolution/socialite-discord 是一个让你能在 Laravel Socialite 中使用 Discord OAuth2 认证的驱动包。
Laravel Socialite 的内置 provider 中不包含 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 scope)
// $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');
}
}
Scope 配置
Discord OAuth2 通过 scope 指定要获取的权限。默认 scope 仅为 identify。
public function login()
{
return Socialite::driver('discord')
->setScopes(['identify', 'email', 'guilds', 'guilds.join'])
->redirect();
}
主要 scope 列表:
| Scope | 可获取的信息 |
|---|
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 scope。若未指定 scope,getEmail() 可能返回 null。
与其他 Socialite 驱动的比较
该包通过 Socialite::extend() 以官方方式实现,可以与内置 provider 使用完全相同的 API。关于自定义 provider 的机制以及 Socialite::extend() 的详情,请参见 Socialite 指南。