Recaptcha без картинки - необходимо понять алгоритм

Discussion in 'PHP' started by zemsky, 4 Nov 2016.

  1. zemsky

    zemsky New Member

    Joined:
    3 Nov 2016
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Всем добрый день.

    Возникла необходимость сделать авторизацию на сайте, подгружающем recaptcha в hidden поле формы. Имеется 2 попытки ввести логин и пароль, с 3 попытки, как обычно, показывается картинка. При 1 и 2 попытке на сервер отправляются куки с единственной сессией и данные в JSON формате:
    1. {"token":"gWAmz8OzvLROMD5v0Va4IJnqFPD4G5dpzoFIXgSU",
    2. "login":"login",
    3. "password":"pass",
    4. "session_id":null,
    5. "recaptcha_challenge_field":"03AHJ_VutaHBYgm9lraxZjburS8bCnehqxN4hbJZ8wNJXgwp_n2p8GrY8YGtdSWYlTqCAM4hUMoAxIuDU_EuX-SlTK6HfrZy8YepehjtANEgNjo-w-c3z_DjUNoLoRUB29VjixfJjMn3oednpQc8QBbfTgNj03eMfxX2sULJ0nJgL9ExUMvxvkCCH51NnMfiJ4VNCOrOLzvbK-IwMrls-65YYHKYzp6EgU9A",
    6. "recaptcha_response_field":""}
    Как видим, при первых 2 попытках "recaptcha_response_field" нам даже и не нужна.
    В ответ, в случае успеха, прилетают JSON данные с сессией, либо, в случае неудачи, JSON данные с ошибкой.

    И все было бы хорошо, НО, почему-то авторизация с кодом 200 проходит ТОЛЬКО ДЛЯ 1 ЕДИНСТВЕННОЙ УЧЕТНОЙ ЗАПИСИ! С любой другой (завел их 4 шт. на сайте) посылают куда подальше с ответом 400
    и пояснением:
    httponly {
    "errors":["Что-то пошло не так"],
    "captcha":{"show_at_login":false}
    }
    Если удалить куки, то и для 1 рабочей учетной записи валится такая же ошибка.

    В браузере до лампочки, все 4 учетки логинятся на Ура. Из PHP скрипта - только 1 учетная запись поддается. Я бы понял, если бы ни одна уч. запись не проходила - означало бы, что скрипт не рабочий. А тут рабочий на 1/4 :).

    Что сделано в скрипте:
    1. Цепляем токен формы.
    2. Получаем сессию.
    3. Получаем значение recaptcha_challenge_field в том числе и перезагрузив его в
      https://www.google.com/recaptcha/api/reload?c=полученное_значение
      &k=открытый_ключ_сайта&reason=i&type=image&lang=ru
    4. Формируем JSON
    5. Отправляем методом POST
    Знаю, что другие авторизацию реализовали посредством AJAX, запуская ее вручную. Для меня же предпочтительно посредством BackEnd.
     
    #1 zemsky, 4 Nov 2016
    Last edited: 4 Nov 2016
  2. zemsky

    zemsky New Member

    Joined:
    3 Nov 2016
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    P.S. Больше не актуально. Баг был в Content-Length заданном по дефолту в запросе и не изменяющемся.
    Убрал из заголовков вообще и Curl начал автоматически генерировать заголовок с правильным значением.