reCaptcha v3 с ColdFusion - PullRequest
       16

reCaptcha v3 с ColdFusion

0 голосов
/ 30 января 2019

Я пытаюсь интегрировать reCaptcha (v3) в сайт ColdFusion.Я не слишком разбираюсь в синтаксисе CF и в настоящее время, похоже, ничего не получаю от запроса проверки на стороне сервера.

Может кто-нибудь увидеть что-то явно неправильное и / или указать мне правильное направление, пожалуйста?

Клиентская сторона:

<script src='https://www.google.com/recaptcha/api.js?render=6..."></script>
<script>
    grecaptcha.ready(function() {
        grecaptcha.execute('6...', {action: 'contact'})
        .then(function(token) {
            $("#recaptchaToken").val(token);
        });
    });
</script>

Я имеюв моей форме есть скрытое поле recaptchaToken, и я вижу, как в него входит значение token.

На стороне сервера:

<cfhttp
  url="https://www.google.com/recaptcha/api/siteverify"
  method="POST"
  result="captchaResponse">
  <cfhttpparam
    type="formfield"
    name="secret"
    value='6...'
  />
  <cfhttpparam
    type="formfield"
    name="response"
    value='#form.recaptchaToken#'
  />
</cfhttp>

<cfdump var=#captchaResponse.filecontent# />

Я получаю вывод красного поля с заголовком object of java.io.ByteArrayOutputStream

Я пытался сбросить оба captchaResponse и captchaResponse.filecontent безрезультатно.

Я ожидаю данных в виде:

{
  "success": true|false,      // whether this request was a valid reCAPTCHA token for your site
  "score": number             // the score for this request (0.0 - 1.0)
  "action": string            // the action name for this request (important to verify)
  "challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
  "hostname": string,         // the hostname of the site where the reCAPTCHA was solved
  "error-codes": [...]        // optional
}

Обновление

Решение выглядит так, как предложил Алекс:

<cfdump var=#toString(captchaResponse.filecontent)# />

Это дает мне строку JSON в ожидаемом формате, чтобы я мог преобразовать ее в объект и завершить проверку.

1 Ответ

0 голосов
/ 30 января 2019

Всякий раз, когда cfhttp не уверен, как обрабатывать ответ, необработанное содержимое остается нетронутым и сохраняется в виде байтового массива.Обычно это указывает на то, что заголовок Content-Type не указан отвечающим сервером или контент был получен только частично.

Чтобы принудительно представить строковое представление контента, вы можете использовать toString() для преобразования необработанного байтового массива, например toString(captchaResponse.filecontent).Эта функция достаточно надежна и может обрабатывать уже преобразованные строки, поэтому ее обычно безопасно использовать.

Однако здесь есть кое-что еще, о чем следует знать.При использовании cfhttp без установки атрибута throwOnError на true (значение по умолчанию false) неудачные запросы HTTP будут по-прежнему возвращать результат, поврежденный результат.Структура не будет содержать ключ fileContent и, следовательно, вызовет исключение во время выполнения.Вы можете добавить здесь обработку ошибок, если https://www.google.com/recaptcha/api/siteverify недоступен или принятый протокол TLS не поддерживается вашей JRE.У нас была эта проблема с SNI и TLS 1.2 с прежней версией ColdFusion, а именно 8. Будьте предупреждены.

...