Спросите помощника
0/400
Вопрос обрабатывается ИИ-сервисом и сохраняется для улучшения ответов. Не вводите персональные данные.

    Captcha

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

    Тип: 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 — объявление сервиса
    menu_baseline