Что за ошибка Вконтакте invalid client

Пытаюсь реализовать регистрацию/авторизацию на своём сайте через соц. сеть. Не совсем понятен принцип работы и дальнейшая безопасность после авторизации.

Создал приложение, добавил JS VK к себе, добавил тот скрипт, что там прописан. Соединение проходит, возвращается ID, имя и т.д. (всё что запрошу). Но как мне записать что-нибудь в БД, чтобы потом определить, что этот пользователь зарегистрирован/авторизован? Никакого хэша, который я бы мог использовать в этих целях, не возвращается.

Конечно, я могу после авторизации и получения ответа через JS, отправить AJAX-запрос к себе на сервер с ответом, который вернул ВК, но как проверить со стороны сервера, что авторизация прошла успешно и это не злоумышленник подсунул левый ID?

Хочется сделать именно асинхронную авторизацию, чтобы после клика на кнопку проверились данные и прошла авторизация/регистрация, и при этом она была бы безопасной.

Смотрел серию уроков «PHP » Аутентификация через ВКонтакте» и читал другие темы по этим вопросам, но, в основном, везде рассматривается синхронная авторизация, где пользователь будет несколько раз перенаправлен на другие страницы сайта, а мне такой вариант не подходит. Допускаю только одно обновление страницы пользователя: только тогда, когда он уже авторизован/зарегистрирован. Всё остальное — в асинхронном режиме.

Invalid Client ВКонтакте — решение

Опять же, могу отправить ID пользователя к себе на сервер в свой скрипт, но как проверить его? Ведь у меня не будет параметра code , как в примере по ссылке выше и, соответственно, я не смогу отправить запрос для получения access_token .

Поправка: параметр code нашёл, а вот параметра redirect_uri — нет, и VK отвечает так:

Делаю запрос так:

$params = array( ‘client_id’ => ‘тут ид моего приложения’,

‘client_secret’ => ‘тут ключ моего приложения’,

‘code’ => $_POST[‘user’][‘sid’],

‘redirect_uri’ => »);

$token = json_decode(file_get_contents(‘https://oauth.vk.com/access_token’ . ‘?’ . urldecode(http_build_query($params))), true);

Понял, что процедуры серверного получения code не избежать. Начал делать по этим инструкциям: https://vk.com/dev/auth_sites

Предварительно всё равно провожу клиентскую авторизацию и только при успехе отправляю запрос на сервер, который затем отправляет запрос для получения переменной code , но опять вылазит окно с требованием ввести логин/пароль VK (на этот раз его требует серверная авторизация), а не нормальный ответ. В качестве redirect_uri указываю адрес вызываемого AJAX-файла, надеясь, что сервер VK вернёт туда $_GET[‘code’] , и следующем запросом я смогу уже получить access_token .

Еще по теме:  Как назвать группу орифлейм ВК

Я так понимаю, окно с повторной авторизацией вылазит потому, что идёт проверка IP, которые не совпадают. Как быть?

Не понимаю, почему бы не сделать один и тот же code -ключ при клиентской авторизации и при серверной, чтобы можно было связать воедино и добиться-таки доступа в одно обновление страницы пользователя (с вылезающем окном VK, это ничего), но не 3-4 редиректа, как предлагается при полностью серверной авторизации в документации. Или, может, что-то делаю не так (что вероятнее).

Как взломать аккаунт в майнкрафт

Начал в PHP-файле делать так:

Теперь возвращается code при прямом открытии PHP-файла, а если он вызывается AJAX`ом, то там, понятное дело, ошибка после редиректа:

Попытка использовать cURL или file_get_contents приводит к тому, что возвращается форма авторизации ВК и начинает «скакать» в прямом смысле слова на экране.

Эх 🙁 Продолжаю разбираться. Может есть способ отправить запрос VK, но чтобы тот не редиректил назад, а вернул только ответ? (без redirect_uri сразу возращает ошибку)

UPD

Разобрался почти со всем самостоятельно: пришлось отказаться от авторизации «в один клик» и смириться с неизбежным — двумя редиректами сначала за code , а потом за access_token . Теперь другая проблема — как разлогинить приложение у пользователя?

А то получается, после одного подтверждения пользователем всё сохраняется и больше пользователя уже никто не спрашивает, разрешает ли он доступ сайта к данным, или нет. С одной стороны — это удобно, но с другой — у пользователя ведь может быть несколько учётных записей VK, или за одним компьютером могут сидеть несколько человек.

Поэтому нужно дать возможность разлогинить приложение у пользователя, например, при переходе по ссылке. Как я понял, это делается по ссылке

Но там ещё требует хэш, который непонятно откуда брать: в документации ни слова про разлогин. Техподдержка вконтакте молчит. Может хоть тут помогут?
Я пытался по-всякому передавать туда и code -переменную из авторизации, и access_token — толку нет, всё время:

Еще по теме:  Отзывы оформить красиво Вконтакте

Источник: husl.ru

Почему выходит ошибка «invalid _client» при запросе доступа к токену в Oauth2 ZohoMail API?

Всем здравствуйте. Прошу помочь решить эту (уже до смерти надоевшую) ошибку. После успешного получения кода авторизации, я вызываю POST запрос для доступа к токену (access_token). Но запрос возвращает мне «invalid_client», весь интернет прощарила, все попробовала, но ничего не помогло. Та же ошибка.

И написала в support ZohoMail APİ. Ничего не ответили:( Также прочитала и всю документацию ZohoMail APİ досконально, а также рассмотрела документацию oauth2.0 protocol. И вроде согласно этой документации все у меня правильно. И php код вроде рабочий, но может я передаю не те параметры? И ксати, возможно ли эта ошибка из-за пробной подписки?

Прошу и вас, знатоков этого дела, рассмотреть мой код, может кто-то найдет мою ошибку. Мне нужно его срочно решить:( Буду вам очень благодарна. Заранее спасибо 🙂

public function get_access_token() < $headers = array( /*’Authorization: Basic ‘ . $this->client_secret,*/ /* ‘Content-Type: application/x-www-form-urlencoded’*/ ); $taskurl = ‘https://accounts.zoho.com/oauth/v2/token’; $cdata = array( ‘code’ => $this->zoho_oauth_code, ‘redirect_uri’ => ‘https://testingapi.ml/callback’, ‘grant_type’ => ‘authorization_code’, ‘client_id’ => $this->client_id, ‘client_secret’ => $this->client_secret, ‘scope’ => ‘ZohoMail.accounts.all,ZohoMail.organization.accounts.all,ZohoMail.organization.domains.all’, ‘state’ => $this->generateRandomString() ); $curlresult = $this->docurl($taskurl, $cdata, $headers); return $curlresult; > public function docurl($taskurl, $cdata, $headers, $method = ‘post’,$sendjson=true) < $ch = curl_init(); if ($method == ‘get’) < if ($cdata) < $query = ‘?’ . http_build_query($cdata); $taskurl .= $query; >curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘GET’); > elseif ($method == ‘delete’) < curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘DELETE’); >elseif ($method == ‘put’) < curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘PUT’); >elseif ($method == ‘patch’) < if($sendjson) $cdata = json_encode($cdata); curl_setopt($ch, CURLOPT_POSTFIELDS, $cdata); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘PATCH’); >else < if($sendjson) < $cdata = json_encode($cdata); >curl_setopt($ch, CURLOPT_POSTFIELDS, $cdata); curl_setopt($ch, CURLOPT_POST, true); /* curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);*/ > curl_setopt($ch, CURLOPT_URL, $taskurl); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $res = curl_exec($ch); $information = curl_getinfo($ch); curl_close($ch); $resj = json_decode($res); return $resj; >

5ce3f12983d08451733494.png

  • Вопрос задан более трёх лет назад
  • 269 просмотров

Источник: qna.habr.com

Почему я получаю invalid_client с этим запросом POST?

Я пытаюсь связаться с внешним API, имеющим следующую спецификацию:

Еще по теме:  Vkfaces что это за сайт

Host: name.of.host Content-Type: application/x-www-form-urlencoded Cache-Control: no-cache

Используя модуль request npm , я создаю запрос POST следующим образом:

function post2(uri, headerObj, bodyObj, bodyStr) < console.info(«Posting to » + uri + » . . .»); var options = < uri: uri, form: bodyObj, qs: bodyObj, method: ‘POST’, json: false, headers: headerObj >; request(options, function(error, response) < console.info(JSON.stringify(response)); console.info(error, response.body); return; >); >

Объекты заголовка и тела настраиваются следующим образом:

var headerObj = < ‘Host’: ‘name.of.host’, ‘Content-Type’: ‘application/x-www-form-urlencoded’, ‘Cache-Control’: ‘no-cache’ >; var bodyObj = < ‘client-id’: ‘GUID’, ‘grant_type’: ‘refresh_token’, ‘refresh_token’: ‘alpha-numeric data that also includes / = and + chars’ >;

Я сослался на документацию по здесь относительно модуля request npm и следил за запрос (варианты, обратный звонок), начиная с request.post похоже, не позволяет вводить какие-либо заголовки. Что я делаю неправильно?

— РЕДАКТИРОВАТЬ —

Итак, теперь я попытался использовать вместо этого XMLHttpRequest и установить такие же точные заголовки. Сначала у меня возникла ошибка Refused to set unsafe header «Host» , поэтому я удалил заголовок Host и попробовал снова. На этот раз у меня не было ошибок, но и на cmd не было напечатано никакого ответа (я использую node для развертывания).

var XMLHttpRequest = require(«xmlhttprequest»).XMLHttpRequest; var xhr = new XMLHttpRequest(); xhr.open(«POST», ‘/connect/token’, true); //Send the proper header information along with the request xhr.setRequestHeader(«Host», «name.of.host»); xhr.setRequestHeader(«Content-type», «application/x-www-form-urlencoded»); xhr.setRequestHeader(«Cache-Control», «no-cache»); xhr.onreadystatechange = function() < // Call a function when the state changes. if (xhr.readyState == XMLHttpRequest.DONE xhr.status == 200) < // Request finished. Do processing here. console.info(xhr.responseText); >> xhr.send(«client-id=guidrefresh_token=tokenstuff»);

Я не понимаю, что может быть не так. Я не вижу исходящих запросов в браузере, но определенно предпринимается попытка, потому что я вижу журналы из узла cmd.

Комментарии (9)

Можете ли вы открыть вкладку сети в инструментах отладки вашего браузера и посмотреть, как выглядит запрос? developers.google.com/web/tools/chrome-devtools/…

Ах, вы намеревались, чтобы значение bodyObj.’client-id’ было жестко запрограммированной строкой «GUID»?

Что в документации внешнего API говорится о «error»:»invalid_client» ?

Для всех — пожалуйста, ознакомьтесь с правкой, которую я внес в этот вопрос.

Источник: reddeveloper.ru

Рейтинг
( Пока оценок нет )
Загрузка ...