Как передать code_challenge и code_verifier для Snapchat API - PullRequest
1 голос
/ 28 марта 2020

Я попробовал абсолютно все, чтобы заставить 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. "}


...