Yesod Non- AJAX HTML Форма CSRF Token - PullRequest
2 голосов
/ 04 марта 2020

Я только что включил промежуточное ПО защиты CSRF в Yesod.

Мои вызовы jQuery AJAX работают, с токеном CSRF, добавляемым в заголовок в соответствии с обычным скаффолдом.

Теперь у меня есть нормальная HTML форма "POST", не сгенерированная Yesod . Я хочу включить токен защиты CSRF в качестве скрытого ввода.

Пока у меня это есть в моем ExampleHandler.hs

            mcsrftoken <- fmap reqToken getRequest                                                                                                                  
            let csrftoken = case mcsrftoken of                                                                                                                      
                                Nothing -> "NO_TOKEN"                                                                                                               
                                Just t  -> t            

(Спасибо Snoymaster на Yesod 1.2 CSRF защита )

И в example.hamlet:

  <form method="post" action="@{ExampleR someId}">
   <input name="_token" type="text" value=#{csrftoken}>

Эта форма работает.

У меня много обработчиков, поэтому я не хочу вставлять код (или функцию) в каждый из них, чтобы получить токен. Я также не хочу конвертировать все мои HTML формы в AJAX.

Я попытался вставить указанный выше фрагмент извлечения токена в Foundation.hs, чтобы получить токен повсюду, но затем я получил:

 Variable not in scope: csrftoken

На строке в обработчике, где example.hamlet выдвинут.

Как я могу получить переменную csrftoken в области видимости во всех обработчиках?

Есть ли лучший способ получить токен CSRF в не сгенерированный HTML формы?

Спасибо, haskellers и поклонников Yesod

...