A provider for Laravel Socialite that allows authentication as a Discord user or bot.
composer require martinbean/socialite-discord-provider:^1.2
The package registers a Socialite driver with the name of discord
.
Before using the driver, create an OAuth application in Discord’s developer portal: https://discord.com/developers/applications
Set your client ID and client secret as environment variables, and then reference them in your config/services.php file. You will also need to add a redirect URL to your application if you intend to authenticate as a user.
<?php
// config/services.php
return [
// Any other services
'discord' => [
'client_id' => env('DISCORD_CLIENT_ID'),
'client_secret' => env('DISCORD_CLIENT_SECRET'),
'redirect' => '/auth/discord/callback',
],
];
The redirect
value will need to match a redirect URL in your Discord application settings. It can be relative as above.
Create a controller to redirect and handle the access token callback:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;
class DiscordController extends Controller
{
/**
* Redirect the user to the Discord authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('discord')->redirect();
}
/**
* Obtain the user information from Discord.
*
* @return \Illuminate\Http\Response
*/
public function handleProviderCallback()
{
$user = Socialite::driver('discord')->user();
// $user->token;
}
}
Discord supports various scopes when authenticating as a user. You can find a list here: https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes
To request additional scopes when authenticating, you can use the scopes
method before redirecting:
return Socialite::driver('discord')
->scopes(['guilds', 'messages.read'])
->redirect();
Discord allows you to add “bots” to guilds (servers). This is a modified OAuth flow, where you are redirected to Discord to confirm the guild you wish to add a bot to. There is no redirect back to your application when you authorize the request.
You can authenticate as a bot by using the bot
method before redirecting:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;
class DiscordController extends Controller
{
/**
* Redirect the user to the Discord authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('discord')->bot()->redirect();
}
}
If you know the guild ID you wish to add your bot to, you may specify it with the guild
method:
return Socialite::driver('discord')
->bot()
->guild($guildId)
->redirect();
Additionally, you can disable the guild select:
return Socialite::driver('discord')
->bot()
->guild($guildId)
->disableGuildSelect()
->redirect();
Note: if you try and disable guild selection without specifying a guild, the package will throw a GuildRequiredException
instance.
If you have any problems using this package, please open an issue on the GitHub repository.