Ask the assistant
0/400
Your question is processed by an AI service and kept to improve answers. Do not enter personal data.

    Captcha

    This page has not been translated into English yet. The Russian original is below.

    Проверка «я не бот» для формы сайта. Обёртка: рисует виджет сервиса над своим ребёнком и выпускает форму только с токеном на руках.

    Тип: wrapper Только веб: в приложении элемент рисует ребёнка, verify ничего не делает: установленное приложение — не анонимная форма.

    State @message:"" @proof:""
      HttpData url:"https://api.example.com/v1/complaints" method:"POST"
          immediate:false watch:false refresh:@send
          body:{jsonEncode(mapOf("message", message, "captchaToken", proof))}
        Captcha token:@fresh failed:@down verify:@checkHuman
            onVerified:(){proof = fresh; send()}
          Column
            ElevatedButton onPressed:(){checkHuman()}
              Text "Отправить"
            Text "Напишите нам на почту." if:$down

    Параметры

    Параметр Тип Описание
    token выход, string Токен для запроса. Пуст, пока проверка не пройдена, и снова пуст, когда истёк
    failed выход, bool true , когда сервис недоступен или не объявлен в project.json
    verify выход, функция Её зовёт кнопка формы. Запускает проверку; запрос уходит из onVerified
    onVerified колбэк Выполняется, когда токен есть: положить его туда, откуда его читает запрос, и отправить

    Сервис и ключ в разметке не пишутся — они объявлены в `settings.captcha` .

    Как это работает

    • Кнопка зовёт проверку, а не отправку. verify запускает проверку, onVerified срабатывает только с токеном. Видимый виджет, который посетитель уже отметил, отправляет сразу; не отмеченный — как только отметит.
    • Отправляет нажатие, а не галочка. Токен, полученный до нажатия, просто ложится в token .
    • Токен одноразовый и живёт недолго. Следующий verify после отправки сам сбрасывает виджет и ждёт нового токена; истёкший токен пустеет.
    • Токен проверяет сервер , которому форма шлёт данные, — своим серверным ключом. Куда положить токен (тело, заголовок, имя поля), решает разметка, потому что это требование бэкенда.
    • Вид виджета подбирается сам. Ширина — не больше 400 px, тема — по фону, на котором он стоит: на тёмной странице виджет тёмный. В разметке для этого писать нечего.

    Правила

    • MUST Кнопка и всё, что читает выходы, — ВНУТРИ Captcha : сосед элемента его выходов не видит, и обработчик кнопки молча не сработает.
    • MUST Запрос ( HttpData ) — СНАРУЖИ, выше элемента: колбэк видит то, что объявлено выше. Тело запроса при этом не видит выходов внутри, поэтому токен переносится в переменную страницы ( proof = fresh ).
    • MUST Сервер обязан проверять токен. Токен, который никто не проверяет, ни от чего не защищает.
    • MUST NOT Серверный ключ в project.json не кладётся.
    • SHOULD Покажите запасной путь по failed : без токена форма не уходит никогда, и человеку нужен другой способ связаться.

    See also

    • Session — вход посетителя; форма регистрации — первый кандидат на капчу
    • Script — авторский JavaScript на странице
    • project.json — объявление сервиса
    DOCS
    dark_mode_baseline
    RU/EN
    menu_baseline