Авторизация через Discord на PHP

авторизация через Discord

Если у вас есть проект, у которого есть и сайт и сервер в Discord, вам для сайта может понадобиться авторизация через Discord. Это крайне полезно в случаях, когда нужно получить и сохранить в БД Discord ID пользователя, чтобы в дальнейшем выполнять с ним действия через ваш бот. Например вы сможете автоматически назначать роль участнику сервера, согласно его роли на сайте и многое другое, о чем я рассказал в отдельной статье. А в этой статье я покажу, как без особого труда сделать такую авторизацию через Discord на PHP.

Для тестов создайте на вашем сайте отдельный php скрипт, через который будет происходить авторизация, например discord-connect.php. Далее нам понадобится создать приложение в Discord Developer Portal. Теперь зайдите в ваше приложение и перейдите в раздел Oauth2, скопируйте CLIENT ID, сгенерируйте и скопируйте CLIENT SECRET, пропишите их в переменные вашего скрипта:

<?php
$client_id = CLIENT_ID_HERE;
$client_secret = 'CLIENT_SECRET_HERE';

Ниже в разделе Redirects вашего приложения, вставьте полную ссылку до вашего discord-connect.php и сохраните изменения.

Добавим в скрипт переменные с необходимыми ссылками, которые потребует авторизация через Discord:

$script_url = 'https://example.com/discord-connect.php'; // ссылка до вашего скрипта
// ссылки oauth и api discord
$oauth_url = 'https://discord.com/api/oauth2/authorize';
$token_url = 'https://discord.com/api/oauth2/token';
$api_user_url = 'https://discord.com/api/users/@me';
$revoke_url = 'https://discord.com/api/oauth2/token/revoke';

Также добавим в наш скрипт функцию для api запросов в Discord:

function api_request($type, $url, $data = array(), $token = null) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $headers[] = 'Accept: application/json';
    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    if ($token != null) $headers[] = 'Authorization: Bearer '.$token;
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    return json_decode(curl_exec($ch), true);
}

Авторизация через Discord будет работать следующим образом: при редиректе пользователя на этот скрипт, он будет перенаправляться на страницу авторизации Discord, после чего снова произойдет редирект на этот скрипт, но уже с кодом авторизации, который мы сразу же используем, чтобы получить информацию о пользователе через api. Ниже представлен основной код с комментариями.

if (isset($_GET['code'])) {
	// это условие сработает при редиректе от Discord после авторизации
	$code = htmlspecialchars($_GET['code']); // получаем код авторизации
	// готовим api запрос
	$data = [
		'client_id' => $client_id,
		'client_secret' => $client_secret,
		'grant_type' => 'authorization_code',
		'code' => $code,
		'redirect_uri' => $script_url,
	];
	$res = api_request('POST', $token_url, $data);
	$token = $res['access_token']; // получаем токен
	$user = api_request('GET', $api_user_url, [], $token); // запрашиваем данные о пользователе
	var_dump($user); // массив данных
	
	// например так мы получим user_id пользователя:
	$user_id = $user['id'];
	
	// далее вы можете записать этот user_id в БД, а также выполнять любые другие действия с данными
	
	// если вам нужно было только получить и сохранить user_id для бота, вы при желании можете отозвать токен авторизации:
	api_request('POST', $revoke_url, $data);
	
	// после всех действий вы можете перенаправить пользователя куда нужно, например в профиль:
	header('Location: /profile');
} else {
	// запускаем авторизацию через Discord
	$data = [
		'client_id' => $client_id,
		'redirect_uri' => $script_url,
		'response_type' => 'code',
		'scope' => 'identify'
	];
	header('Location: '.$oauth_url.'?'.http_build_query($data));
}

На этом статья об авторизации через Discord подошла к концу, ведь здесь все довольно просто. Желаю вам удачи с реализацией!