Skip to content

Instantly share code, notes, and snippets.

@Keyinator
Forked from Jengas/index.php
Last active February 25, 2024 18:08
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Keyinator/1a3c1eaf715441dcd7eb305c22d84db5 to your computer and use it in GitHub Desktop.
Save Keyinator/1a3c1eaf715441dcd7eb305c22d84db5 to your computer and use it in GitHub Desktop.
Discord oauth2 example PHP
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('max_execution_time', 300); //300 seconds = 5 minutes. In case if your CURL is slow and is loading too much (Can be IPv6 problem)
error_reporting(E_ALL);
define('OAUTH2_CLIENT_ID', 'PLEASE EDIT');
define('OAUTH2_CLIENT_SECRET', 'PLEASE EDIT');
$authorizeURL = 'https://discordapp.com/api/oauth2/authorize';
$tokenURL = 'https://discordapp.com/api/oauth2/token';
$apiURLBase = 'https://discordapp.com/api/users/@me';
$revokeURL = 'https://discordapp.com/api/oauth2/token/revoke';
session_start();
if(get('action') == 'login') {
$params = array(
'client_id' => OAUTH2_CLIENT_ID,
'redirect_uri' => 'https://dev.keyinator.net/KeyBot/test.php',
'response_type' => 'code',
'scope' => 'identify guilds email'
);
// Redirect the user to Discord's authorization page
header('Location: https://discordapp.com/api/oauth2/authorize' . '?' . http_build_query($params));
die();
}
if(get('code')) {
// Exchange the auth code for a token
$token = apiRequest($tokenURL, array(
"grant_type" => "authorization_code",
'client_id' => OAUTH2_CLIENT_ID,
'client_secret' => OAUTH2_CLIENT_SECRET,
'redirect_uri' => 'https://dev.keyinator.net/KeyBot/test.php',
'code' => get('code')
));
$logout_token = $token->access_token;
$_SESSION['access_token'] = $token->access_token;
header('Location: ' . $_SERVER['PHP_SELF']);
}
if(session('access_token')) {
$user = apiRequest($apiURLBase);
echo '<h3>Logged In</h3>';
echo '<h4>Welcome, ' . $user->username . '</h4>';
echo '<pre>';
print_r($user);
echo '</pre>';
echo '<p><a href="?action=logout">Log Out</a></p>';
} else {
echo '<h3>Not logged in</h3>';
echo '<p><a href="?action=login">Log In</a></p>';
}
if(get('action') == 'logout') {
apiRequest($revokeURL, array(
'token' => session('access_token'),
'client_id' => OAUTH2_CLIENT_ID,
'client_secret' => OAUTH2_CLIENT_SECRET,
));
unset($_SESSION['access_token']);
header('Location: ' . $_SERVER['PHP_SELF']);
die();
}
function apiRequest($url, $post=FALSE, $headers=array()) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch);
if($post)
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$headers[] = 'Accept: application/json';
if(session('access_token'))
$headers[] = 'Authorization: Bearer ' . session('access_token');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
return json_decode($response);
}
function get($key, $default=NULL) {
return array_key_exists($key, $_GET) ? $_GET[$key] : $default;
}
function session($key, $default=NULL) {
return array_key_exists($key, $_SESSION) ? $_SESSION[$key] : $default;
}
?>
@Keyinator
Copy link
Author

Fixed logout with the tip of @crusardri

@umair9747
Copy link

So if i implement it on a complete new page, say for example if i have a button on homepage to open another webpage consisting of an upload form, i want the upload page to be only limited to signed in discord user.. So if i just put this whole code in my upload.HTML file will it work? And what's the redirect URL thing in the code?

@JacobThaDev
Copy link

the API call itself is failing. Only reason this works is because you're removed the access token from session and refreshed the page.

@thegame4craft
Copy link

that doesn't work, i will be directed to the main page not in discord to login when i test it.

Copy link

ghost commented Sep 29, 2020

Not working. Thank you =)

@Magicienghost
Copy link

It works fine, only problem when I refresh the page while connected, it gives me an error

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment