在我的网站上设置 Discord oauth2 登录(使用 PHP?)
Posted
技术标签:
【中文标题】在我的网站上设置 Discord oauth2 登录(使用 PHP?)【英文标题】:Setting up a Discord oauth2 login on my website (with PHP?) 【发布时间】:2019-07-23 00:49:40 【问题描述】:所以我在学习如何通过我的网站上的不和谐设置登录时遇到了麻烦。我已经浏览了几个小时,但找不到任何我理解的东西......
目前,我已经创建了 discord 应用程序,给了我一个客户端 ID 和客户端密码,以及一个返回到我的本地主机的链接:
https://discordapp.com/api/oauth2/authorize?client_id=550631359337594881&redirect_uri=http%3A%2F%2Flocalhost&response_type=code&scope=identify
目前,我已将其设置为从按钮重定向到该 URL,然后该 URL 将我发送到不和谐以接受。然后它会将我返回到http://localhost?code=CODE_HERE
但是,我不知道我应该如何处理这段代码。我正在尝试对其进行设置,以便它显示带有主题标签的人的用户名以及他们的个人资料图片。
我目前在网站上使用 html、CSS、JS 和 php,但我想我可能需要使用其他东西,但我不知道如何设置,或者我需要什么。我正在使用 XAMPP 运行我的本地服务器。我更喜欢它只是 PHP,但我对其他选项持开放态度。
有人知道如何将代码转换为用户名+图片吗?
提前致谢!
【问题讨论】:
【参考方案1】:试试这个
归功于:eslachance
<?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', '1234567890'); //Your client Id
define('OAUTH2_CLIENT_SECRET', 'verysecretclientcode'); //Your secret client code
$authorizeURL = 'https://discordapp.com/api/oauth2/authorize';
$tokenURL = 'https://discordapp.com/api/oauth2/token';
$apiURLBase = 'https://discordapp.com/api/users/@me';
session_start();
// Start the login process by sending the user to Discord's authorization page
if(get('action') == 'login')
$params = array(
'client_id' => OAUTH2_CLIENT_ID,
'redirect_uri' => 'https://yoursite.location/ifyouneedit',
'response_type' => 'code',
'scope' => 'identify guilds'
);
// Redirect the user to Discord's authorization page
header('Location: https://discordapp.com/api/oauth2/authorize' . '?' . http_build_query($params));
die();
// When Discord redirects the user back here, there will be a "code" and "state" parameter in the query string
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://yoursite.location/ifyouneedit',
'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>';
else
echo '<h3>Not logged in</h3>';
echo '<p><a href="?action=login">Log In</a></p>';
if(get('action') == 'logout')
// This must to logout you, but it didn't worked(
$params = array(
'access_token' => $logout_token
);
// Redirect the user to Discord's revoke page
header('Location: https://discordapp.com/api/oauth2/token/revoke' . '?' . http_build_query($params));
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;
?>
【讨论】:
请注明此代码的原作者。 它并没有真正解释每个部分的作用。最好描述每个部分的作用,以免混淆任何人。【参考方案2】:您拥有用于向 discord API 的许多端点进行身份验证的代码。您需要http://discordapp.com/api/users/@me
端点。您使用授权标头进行身份验证。查看Developer Portal,了解更多关于your endpoint的信息
【讨论】:
以上是关于在我的网站上设置 Discord oauth2 登录(使用 PHP?)的主要内容,如果未能解决你的问题,请参考以下文章
为通过 guilds.join 范围、Discord OAuth2.0 添加到公会的用户赋予角色
Discord 使用 url-query 中的“代码”发送 Oauth2 重定向 url。如何在我的谷歌脚本中获取该代码