Если у вас есть проект, у которого есть и сайт и сервер в 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 подошла к концу, ведь здесь все довольно просто. Желаю вам удачи с реализацией!