Я пишу PHP веб-программу, которая нуждается в доступе и редактировании информации о людях на lichess.org. Их API использует Oauth 2.0 для этого. Проблема не в том, что я поставил в запросе, он только запрашивает информацию о профиле publi c: снимок экрана перенаправленной страницы . Я думаю, что я могу неправильно форматировать URL, но я не могу понять, как, потому что пример кода находится в JavaScript, и я менее знаком с этим. Вот фрагмент кода, который я использую для форматирования строки:
$scopes = "email:read%20preference:write";
$state=generate_string(20);
$authorize_url = "https://oauth.lichess.org/oauth/authorize";
function getAuthorizationCode() {
global $authorize_url, $client_id, $callback_uri;
$authorization_redirect_url = $authorize_url . "?response_type=code&client_id=" . $client_id . "&redirect_uri=" . $callback_uri . "&scope=" . $scopes . "&state=".$state;
header("Location: " . $authorization_redirect_url);
}
И для генерации строки состояния я использую эту вспомогательную функцию
function generate_string($strength,$charset='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
$Length = strlen($charset);
$random_string = '';
for($i = 0; $i < $strength; $i++) {
$random_character = $charset[mt_rand(0, $Length - 1)];
$random_string .= $random_character;
}
return $random_string;
}
И, конечно же, когда я на самом деле пытаюсь запросить ресурс, ответ «отсутствует область». Я использую:
$lichessurl = "https://lichess.org/api/account/email";
function getAccessToken($authorization_code) {
global $token_url, $client_id, $client_secret, $callback_uri;
$authorization = base64_encode("$client_id:$client_secret");
$header = array("Authorization: Basic {$authorization}","Content-Type: application/x-www-form-urlencoded");
$content = "grant_type=authorization_code&code=$authorization_code&redirect_uri=$callback_uri";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $token_url,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $content
));
$response = curl_exec($curl);
curl_close($curl);
if ($response === false) {
echo "Failed";
echo curl_error($curl);
echo "Failed";
} elseif (json_decode($response)->error) {
echo "Error:<br />";
echo $authorization_code;
echo $response;
}
return json_decode($response)->access_token;
}
, чтобы сделать это.