Я попробовал абсолютно все, чтобы заставить code_verifier работать, но безрезультатно.
Все остальное вроде бы нормально. В приведенном примере кода (PHP) мой первый метод (get_snapchat_auth_url ()) создает URL-адрес аутентификации. Кажется, это работает нормально, и он генерирует URL-адрес обратного вызова с кодом и состоянием.
Затем вызывается второй метод (get_access_token ()) с кодом, переданным ему в качестве параметра. Это также, кажется, работает хорошо. Он создает заголовок и поля, используя URL-адрес обратного вызова моего приложения, идентификатор клиента и секрет клиента, и т. Д. c ...
Наконец, называется третий метод (curl ()), который выполняет HTTP-запрос. Опять же, это работает нормально.
Часть, которая не работает, каждый раз, когда я получаю ответ {"error": "invalid_grant", "error_description": "Invalid code_verifier."}
Я пробовал следующие потоки: 1) Создать случайный code_verifier 2) ха sh это с sha256 3) передать его как code_challenge 4) передать оригинальный code_verifier в окончательном запросе
1) Создать случайный code_verifier 2) ха sh это с sha256 3) base 64 кодирует его 4) передает его как code_challenge 5) передает оригинальный code_verifier в окончательном запросе
1) создает случайный code_verifier 2) base 64 кодирует его 3) ha sh это с sha256 4) передать его как code_challenge 5) передать code_verifier в конечном запросе
1) создать случайный code_verifier 2) ha sh это с sha256 3) передать его как code_challenge 4) пройти base 64 в кодировке оригинальный code_verifier в окончательном запросе
1) Создать случайный code_verifier 2) ha sh это с sha256 3) base 64 закодировать его 4) передать его как code_challenge 5) передать base 64 закодированное origi nal code_verifier в конечном запросе
1) создать случайный code_verifier 2) base 64 кодировать его 3) ha sh это с sha256 4) передать его как code_challenge 5) передать base 64 закодированный code_verifier в окончательном запросе
Ни один из этих потоков не работает, и не похоже, что этот процесс задокументирован где-либо на сайте Snapchat ...
public function get_snapchat_auth_url()
{
$scopes = [
'https://auth.snapchat.com/oauth2/api/user.display_name',
'https://auth.snapchat.com/oauth2/api/user.bitmoji.avatar',
'https://auth.snapchat.com/oauth2/api/user.external_id'
];
$state = md5(uniqid(rand(), true));
$code_verifier = "AdleUo9ZVcn0J7HkXOdzeqN6pWrW36K3JgVRwMW8BBQazEPV3kFnHyWIZi2jt9gA";
$code_challenge = hash("sha256",$code_verifier);
$query_params = [
'response_type' => 'code',
'redirect_uri' => config('env.SNAPCHAT_REDIRECT_URL'),
'scope' => implode(' ',$scopes),
'client_id' => config('env.SNAPCHAT_CLIENT_ID_DEV'),
'state' => $state,
'code_challenge' => $code_challenge,
'code_challenge_method' => 'S256'
];
// Return full URL
return "https://accounts.snapchat.com/accounts/oauth2/auth?" . http_build_query($query_params);
}
public function get_access_token($code)
{
$code = 'wMX1MZ2ntN16iSW0EsUzZZ6KtfnDlIeJ3mttbJT8kno';
$redirect_url = config('env.SNAPCHAT_REDIRECT_URL');
$url = "https://accounts.snapchat.com/accounts/oauth2/token";
$client_id = config('env.SNAPCHAT_CLIENT_ID_DEV');
$client_secret = config('env.SNAPCHAT_CLIENT_SECRET_DEV');
$auth = base64_encode("$client_id:$client_secret");
$header = [
"Authorization: Basic $auth"
];
$fields = [
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_url,
'code' => $code,
'code_verifier' => "AdleUo9ZVcn0J7HkXOdzeqN6pWrW36K3JgVRwMW8BBQazEPV3kFnHyWIZi2jt9gA"
];
return $this->curl($url,$header,$fields);
}
public function curl($url,$header,$fields)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$fields_string = '';
foreach($fields as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
$data = curl_exec($ch);
curl_close($ch);
dd($data);
}
Finally, I have tried excluding the `code_verifier` field altogether, but I get the following error:
{"error": "invalid_request", "error_description": "Missing code_verifier. "}