PHPackages                             xervo/kord - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. xervo/kord

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

xervo/kord
==========

Authentication for Laravel with Discord

1.0.0(6mo ago)23MITPHPPHP ^8.1

Since Nov 14Pushed 6mo agoCompare

[ Source](https://github.com/xervocloud/kord)[ Packagist](https://packagist.org/packages/xervo/kord)[ RSS](/packages/xervo-kord/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (4)Versions (2)Used By (0)

Kord - Discord Authentication for Laravel
=========================================

[](#kord---discord-authentication-for-laravel)

[![License](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](LICENSE)

Kord is a Laravel package that provides seamless Discord OAuth2 authentication for your Laravel applications. It handles user authentication, token management, and provides easy access to Discord user data.

Features
--------

[](#features)

- 🔐 **Discord OAuth2 Authentication** - Complete OAuth2 flow implementation
- 👤 **User Management** - Automatic user creation and updates
- 🔄 **Token Management** - Automatic token refresh and expiration handling
- 📦 **Extended Data Storage** - Optional storage of full Discord user data
- 🎨 **Helper Methods** - Easy access to Discord information (Nitro, colors, avatars, etc.)
- 🔧 **Trait Support** - Use the `HasDiscord` trait for direct User model access
- 🛠️ **Installation Command** - Interactive setup with `kord:install`
- 📝 **Well Documented** - Comprehensive documentation and examples

Requirements
------------

[](#requirements)

- PHP 8.1 or higher
- Laravel 10.0 or higher
- Discord Application (Client ID and Secret)

Installation
------------

[](#installation)

### Step 1: Install via Composer

[](#step-1-install-via-composer)

```
composer require xervo/kord
```

### Step 2: Run the Installation Command

[](#step-2-run-the-installation-command)

```
php artisan kord:install
```

This interactive command will:

- Prompt for your Discord Client ID
- Prompt for your Discord Client Secret
- Set up your redirect URI
- Optionally enable extended data storage
- Update your `.env` file automatically

### Step 3: Publish Migrations

[](#step-3-publish-migrations)

```
php artisan vendor:publish --tag=kord-migrations
php artisan migrate
```

### Step 4: Publish Config (Optional)

[](#step-4-publish-config-optional)

```
php artisan vendor:publish --tag=kord-config
```

Discord Application Setup
-------------------------

[](#discord-application-setup)

1. Go to [Discord Developer Portal](https://discord.com/developers/applications)
2. Create a new application or select an existing one
3. Navigate to the "OAuth2" section
4. Add your redirect URI (e.g., `http://localhost/auth/discord/callback`)
5. Copy your Client ID and Client Secret
6. Use these values during the `kord:install` command

Configuration
-------------

[](#configuration)

### Environment Variables

[](#environment-variables)

After running `kord:install`, your `.env` file will contain:

```
DISCORD_CLIENT_ID=your_client_id_here
DISCORD_CLIENT_SECRET=your_client_secret_here
DISCORD_REDIRECT_URI=/auth/discord/callback
DISCORD_STORE_EXTENDED_DATA=false
```

### Config File

[](#config-file)

If you published the config file, you can customize additional settings in `config/kord.php`:

```
return [
    'client_id' => env('DISCORD_CLIENT_ID', ''),
    'client_secret' => env('DISCORD_CLIENT_SECRET', ''),
    'redirect_uri' => env('DISCORD_REDIRECT_URI', '/auth/discord/callback'),
    'scopes' => env('DISCORD_SCOPES', 'identify email'),
    'store_extended_data' => env('DISCORD_STORE_EXTENDED_DATA', false),
    // ... more options
];
```

Usage
-----

[](#usage)

### Basic Authentication Flow

[](#basic-authentication-flow)

#### 1. Redirect Users to Discord

[](#1-redirect-users-to-discord)

```
use Xervo\Kord\Facades\Kord;

// In your controller or route
return redirect(Kord::getAuthorizationUrl());
```

Or use the provided route:

```
// In your blade template
Login with Discord
```

#### 2. Handle Callback

[](#2-handle-callback)

The package automatically handles the OAuth callback at `/auth/discord/callback`. Users will be:

- Created if they don't exist
- Updated with latest Discord information
- Logged in automatically

#### 3. Access Discord Data

[](#3-access-discord-data)

```
use Xervo\Kord\Facades\Kord;

// Get current user's Discord info
$discordInfo = Kord::getCurrentUserDiscordInfo();

// Get avatar URL
$avatarUrl = Kord::getCurrentUserAvatarUrl(256);

// Get full username
$username = Kord::getCurrentUserFullUsername();

// Get specific field
$nitroStatus = Kord::getCurrentUserDiscordField('premium_type');
```

### Using the HasDiscord Trait

[](#using-the-hasdiscord-trait)

Add the trait to your User model:

```
use Xervo\Kord\Traits\HasDiscord;

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasDiscord;

    // ... your model code
}
```

Now you can access Discord data directly on the User model:

```
$user = User::find(1);

// Check if user has Discord
if ($user->hasDiscord()) {
    // Get Discord information
    $username = $user->getDiscordFullUsername();
    $avatarUrl = $user->getDiscordAvatarUrl(256);
    $bannerUrl = $user->getDiscordBannerUrl(1024);
    $accentColor = $user->getDiscordAccentColorHex();

    // Check account status
    $hasNitro = $user->hasDiscordNitro();
    $isVerified = $user->isDiscordVerified();
    $hasMfa = $user->hasDiscordMfa();

    // Access relationships
    $token = $user->discordToken;
    $extendedData = $user->discordData;

    // Refresh data from Discord
    $user->refreshDiscordData();
}
```

### Extended Data Storage

[](#extended-data-storage)

When enabled, the package stores the complete Discord API response in a separate table. This allows access to all Discord fields without cluttering your users table.

#### Enable Extended Data Storage

[](#enable-extended-data-storage)

Set in your `.env`:

```
DISCORD_STORE_EXTENDED_DATA=true
```

Or during installation, answer "yes" when prompted.

#### Access Extended Data

[](#access-extended-data)

```
use Xervo\Kord\Facades\Kord;

$extendedData = Kord::getCurrentUserExtendedData();

if ($extendedData) {
    // Use helper methods
    $hasNitro = $extendedData->hasNitro();
    $accentColor = $extendedData->getAccentColorHex();
    $bannerUrl = $extendedData->getBannerUrl();

    // Get any field
    $customField = $extendedData->getField('some_field', 'default');

    // Get all data
    $allData = $extendedData->getAllData();
}
```

### Available Routes

[](#available-routes)

The package provides the following routes:

RouteMethodDescription`/auth/discord`GETRedirect to Discord OAuth`/auth/discord/callback`GETOAuth callback handler`/auth/discord/logout`POSTLogout and revoke tokens`/auth/discord/refresh`POSTRefresh Discord data### Helper Methods

[](#helper-methods)

#### Kord Facade Methods

[](#kord-facade-methods)

```
use Xervo\Kord\Facades\Kord;

// OAuth
Kord::getAuthorizationUrl($state = null);
Kord::exchangeCodeForToken($code);
Kord::getUser($accessToken);
Kord::refreshToken($refreshToken);
Kord::revokeToken($token);

// Current User
Kord::getCurrentUserToken();
Kord::getCurrentUserDiscordInfo();
Kord::getCurrentUserExtendedData();
Kord::getCurrentUserDiscordField($field, $default);
Kord::getCurrentUserAvatarUrl($size);
Kord::getCurrentUserFullUsername();
Kord::refreshCurrentUserData();
```

#### HasDiscord Trait Methods

[](#hasdiscord-trait-methods)

```
// Relationships
$user->discordToken();
$user->discordData();

// Status
$user->hasDiscord();
$user->isDiscordVerified();
$user->hasDiscordMfa();
$user->hasDiscordNitro();
$user->isDiscordBot();
$user->isDiscordSystem();

// Data Access
$user->getDiscordId();
$user->getDiscordUsername();
$user->getDiscordFullUsername();
$user->getDiscordAvatarUrl($size);
$user->getDiscordBannerUrl($size);
$user->getDiscordAccentColorHex();
$user->getDiscordEmail();
$user->getDiscordLocale();
$user->getDiscordPremiumType();
$user->getDiscordPublicFlags();
$user->getDiscordField($field, $default);
$user->getAllDiscordData();
$user->hasDiscordField($key);
$user->refreshDiscordData();
```

Database Structure
------------------

[](#database-structure)

### Users Table

[](#users-table)

The package adds the following columns to your `users` table:

- `discord_id` - Unique Discord user ID
- `discord_username` - Discord username
- `discord_discriminator` - Discord discriminator
- `discord_avatar` - Avatar hash
- `discord_verified` - Verification status

### discord\_access\_tokens Table

[](#discord_access_tokens-table)

Stores OAuth tokens:

- `user_id` - Foreign key to users
- `access_token` - Discord access token
- `refresh_token` - Refresh token
- `expires_at` - Token expiration
- `token_type` - Token type (usually "Bearer")
- `scope` - OAuth scopes

### discord\_user\_data Table (Optional)

[](#discord_user_data-table-optional)

Stores extended Discord data when enabled:

- `user_id` - Foreign key to users
- `data` - JSON field with complete Discord user data

Examples
--------

[](#examples)

### Example 1: Display User Avatar

[](#example-1-display-user-avatar)

```
@auth
    @php
        $avatarUrl = \Xervo\Kord\Facades\Kord::getCurrentUserAvatarUrl(128);
    @endphp

    @if($avatarUrl)

    @endif
@endauth
```

### Example 2: Check for Nitro

[](#example-2-check-for-nitro)

```
use Xervo\Kord\Facades\Kord;

$extendedData = Kord::getCurrentUserExtendedData();

if ($extendedData && $extendedData->hasNitro()) {
    echo "User has Discord Nitro!";
    echo "Premium Type: " . $extendedData->getPremiumType();
}
```

### Example 3: Use Accent Color

[](#example-3-use-accent-color)

```
@php
    $user = auth()->user();
    $accentColor = $user->getDiscordAccentColorHex();
@endphp

@if($accentColor)

        User's Discord accent color

@endif
```

### Example 4: Refresh User Data

[](#example-4-refresh-user-data)

```
use Xervo\Kord\Facades\Kord;

// Refresh current authenticated user
$success = Kord::refreshCurrentUserData();

// Or using the trait
$user = User::find(1);
$success = $user->refreshDiscordData();
```

### Example 5: List All Discord Users

[](#example-5-list-all-discord-users)

```
use App\Models\User;

$discordUsers = User::whereNotNull('discord_id')->get();

foreach ($discordUsers as $user) {
    echo $user->getDiscordFullUsername();
    echo $user->getDiscordAvatarUrl(64);
}
```

Troubleshooting
---------------

[](#troubleshooting)

### "Session store not set on request"

[](#session-store-not-set-on-request)

Make sure your routes are using the `web` middleware group. The package routes are automatically wrapped in this middleware.

### Discord data not saving

[](#discord-data-not-saving)

Ensure the Discord fields are accessible. The package uses `forceFill()` to bypass mass assignment, but you may want to add them to your User model's `$fillable` array:

```
protected $fillable = [
    'name',
    'email',
    'password',
    'discord_id',
    'discord_username',
    'discord_discriminator',
    'discord_avatar',
    'discord_verified',
];
```

### Token expired errors

[](#token-expired-errors)

The package automatically refreshes tokens when they expire. If you're seeing errors, ensure:

- Refresh tokens are being stored
- Your Discord application has the correct scopes
- The token hasn't been revoked

### Extended data not showing

[](#extended-data-not-showing)

1. Check that `DISCORD_STORE_EXTENDED_DATA=true` in your `.env`
2. Run migrations: `php artisan migrate`
3. Re-authenticate with Discord to populate the data

Security Considerations
-----------------------

[](#security-considerations)

- **Never commit** your `.env` file with Discord credentials
- **Use HTTPS** in production for OAuth callbacks
- **Validate state parameter** (handled automatically by the package)
- **Store tokens securely** (the package handles this in the database)
- **Revoke tokens** on logout (handled automatically)

Contributing
------------

[](#contributing)

Contributions are welcome! Please feel free to submit a Pull Request.

License
-------

[](#license)

This package is open-sourced software licensed under the [MIT license](LICENSE).

Support
-------

[](#support)

For issues, questions, or contributions, please visit the [GitHub repository](https://github.com/xervo/kord).

Credits
-------

[](#credits)

- Created by [Debug](mailto:hi@debug.dog)
- Built for the Laravel community

---

**Made with ❤️ for Laravel developers**

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance68

Regular maintenance activity

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

185d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/0b769193c7315316fbbff8737246375b30aca1ec9aa958cec6090b0c5beffe94?d=identicon)[debugdotdog](/maintainers/debugdotdog)

---

Top Contributors

[![debugdotdog](https://avatars.githubusercontent.com/u/19207112?v=4)](https://github.com/debugdotdog "debugdotdog (1 commits)")

---

Tags

authenticationdiscorddiscordphplaravellaravel-packagephplaravelAuthenticationoauthdiscordsocial-auth

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/xervo-kord/health.svg)

```
[![Health](https://phpackages.com/badges/xervo-kord/health.svg)](https://phpackages.com/packages/xervo-kord)
```

###  Alternatives

[auth0/login

Auth0 Laravel SDK. Straight-forward and tested methods for implementing authentication, and accessing Auth0's Management API endpoints.

2745.0M3](/packages/auth0-login)[wearedevtical/novassport

A Laravel Nova tool to manage API Authentication (Passport).

663.1k](/packages/wearedevtical-novassport)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
