> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Socialite for Discord

> Discord OAuth2 인증을 Laravel Socialite에서 구현하는 드라이버 패키지.

## 개요

[revolution/socialite-discord](https://github.com/invokable/socialite-discord)는 Discord OAuth2 인증을 Laravel Socialite에서 사용할 수 있도록 하는 드라이버 패키지입니다.

Laravel Socialite의 기본 제공 프로바이더에는 Discord가 포함되어 있지 않습니다. 이 패키지만 설치하면 `Socialite::driver('discord')`를 사용한 Discord 로그인을 앱에 추가할 수 있습니다.

<Info>
  Laravel Socialite 자체의 사용법에 대해서는 [Socialite 가이드](/ko/socialite)를 참조하세요.
</Info>

## 설치

```shell theme={null}
composer require revolution/socialite-discord
```

## 설정

### Discord Developer Portal에서 앱 등록

[Discord Developer Portal](https://discord.com/developers/applications)에서 애플리케이션을 생성하고 **OAuth2** 섹션에서 Client ID와 Client Secret을 획득합니다. **Redirects**에 콜백 URL (예: `https://example.com/auth/discord/callback`)을 추가하세요.

### config/services.php

```php theme={null}
'discord' => [
    'client_id'     => env('DISCORD_CLIENT_ID'),
    'client_secret' => env('DISCORD_CLIENT_SECRET'),
    'redirect'      => env('DISCORD_REDIRECT'),
],
```

### .env

```dotenv theme={null}
DISCORD_CLIENT_ID=your-client-id
DISCORD_CLIENT_SECRET=your-client-secret
DISCORD_REDIRECT=https://example.com/auth/discord/callback
```

## 기본적인 사용법

<Steps>
  <Step title="라우트 정의">
    `routes/web.php`에 리다이렉트용과 콜백용 두 라우트를 추가합니다.

    ```php theme={null}
    use App\Http\Controllers\SocialiteController;

    Route::get('auth/discord', [SocialiteController::class, 'login']);
    Route::get('auth/discord/callback', [SocialiteController::class, 'callback']);
    ```
  </Step>

  <Step title="컨트롤러 생성">
    ```php theme={null}
    <?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');
        }
    }
    ```
  </Step>
</Steps>

## 스코프 설정

Discord OAuth2에서는 획득할 권한을 스코프로 지정합니다. 기본 스코프는 `identify`만입니다.

```php theme={null}
public function login()
{
    return Socialite::driver('discord')
                    ->setScopes(['identify', 'email', 'guilds', 'guilds.join'])
                    ->redirect();
}
```

주요 스코프 목록:

| 스코프           | 획득 가능한 정보                |
| ------------- | ------------------------ |
| `identify`    | 사용자 ID, 사용자 이름, 아바타 (기본) |
| `email`       | 이메일 주소                   |
| `guilds`      | 참가 중인 서버 목록              |
| `guilds.join` | 사용자를 서버에 추가하는 권한         |

<Tip>
  전체 스코프는 [Discord OAuth2 문서](https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes)를 참조하세요.
</Tip>

## 사용자 저장과 로그인

콜백 라우트에서 사용자 정보를 획득하고, 데이터베이스에 저장한 뒤 로그인하는 전형적인 구현 예입니다.

```php theme={null}
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');
}
```

<Warning>
  `email`을 획득하려면 `email` 스코프가 필요합니다. 스코프를 지정하지 않는 경우 `getEmail()`은 `null`을 반환할 수 있습니다.
</Warning>

## 다른 Socialite 드라이버와의 비교

이 패키지는 `Socialite::extend()`를 사용한 정규 방식으로 구현되어 있으며, 기본 제공 프로바이더와 완전히 동일한 API로 사용할 수 있습니다. 커스텀 프로바이더의 구조와 `Socialite::extend()`의 자세한 내용은 [Socialite 가이드](/ko/socialite)를 참조하세요.

<Info>
  최신 정보는 [GitHub 저장소](https://github.com/invokable/socialite-discord)를 참조하세요.
</Info>


## Related topics

- [Laravel Socialite (소셜 인증)](/ko/socialite.md)
- [Laravel Notification for Discord(Webhook)](/ko/packages/laravel-notification-discord-webhook.md)
- [Socialite - Laravel Bluesky](/ko/packages/laravel-bluesky/socialite.md)
- [튜토리얼 - Laravel Console Starter](/ko/packages/laravel-console-starter/tutorial.md)
- [Socialite (LINE Login) - LINE SDK for Laravel](/ko/packages/laravel-line-sdk/socialite.md)
