PHP Discord OAUTH2 代码示例不起作用

Posted

技术标签:

【中文标题】PHP Discord OAUTH2 代码示例不起作用【英文标题】:PHP Discord OAUTH2 code sample not working 【发布时间】:2020-12-17 00:59:04 【问题描述】:

所以我在下面找到的这段代码不起作用我进入身份验证屏幕然后当 t 重定向我时它只是说未登录,再次登录。有谁知道我必须做些什么来解决这个问题?我不太擅长 OATH2,希望有人指导我。

我使用了this gist的代码。

<?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');
define('OAUTH2_CLIENT_SECRET', 'verysecretclientcode');

$authorizeURL = 'https://discord.com/api/oauth2/authorize';
$tokenURL = 'https://discord.com/api/oauth2/token';
$apiURLBase = 'https://discord.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;


?>

编辑:基本上在 if 语句中它不会进入登录部分。

【问题讨论】:

我可以看看你提出的要求吗?如果您通过 cURL 命令向我显示请求,则更容易弄清楚发生了什么 【参考方案1】:

所以我发现我的解决方案出了什么问题。我没有复制正确的密钥。您需要的位于 discord 开发门户中的一般信息选项卡下。

【讨论】:

以上是关于PHP Discord OAUTH2 代码示例不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Discord Oauth2 PHP 中的 JPEG 头像

Discord OAuth2:'请求中缺少“代码”'

在我的网站上设置 Discord oauth2 登录(使用 PHP?)

Discord API - 传回生成的 OAuth2 代码的随机“无效代码”错误

discord php curl登录失败

Discord 使用 url-query 中的“代码”发送 Oauth2 重定向 url。如何在我的谷歌脚本中获取该代码