Когда вставляется кольцевой жетон защиты от подделки?

Я пытаюсь понять, когда маркер защиты от подделки кольца создается или вставляется на HTML-страницу. Я использую Compojure / ring / hiccup, но, как я понимаю, мой вопрос действительно о кольце. У меня нет никакой проблемы как таковой: я просто хочу знать, когда и как «вводится» токен защиты от подделки.

Функция anti-forgery-field из ring.util.anti-forgery реализована так:

(html (hidden-field "__anti-forgery-token" *anti-forgery-token*)

Если я вызываю эту функцию в REPL, я получаю:

REPL>  (println (anti-forgery-field))
<input id="__anti-forgery-token" name="__anti-forgery-token" type="hidden" value="Unbound: #&apos;ring.middleware.anti-forgery/*anti-forgery-token*" />

Все еще в REPL, если я попытаюсь получить эту переменную, я получу ту же «несвязанную» переменную:

> ring.middleware.anti-forgery/*anti-forgery-token*
=> #object[clojure.lang.Var$Unbound 0x1eae055 "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"]

Я не понимаю, что это за значение «Unbound» и когда оно преобразуется (кольцом?) В фактический доставленный токен. И я особенно не понимаю, как несколько пользователей, подключающихся к веб-сайту, получают каждый отдельный токен (за сеанс).

Эта переменная всегда «не привязана»? Когда / как он становится «связанным» (если это так?)?

Кроме того, если у меня есть идентификатор кольцевого сеанса (скажем, "ring-session = 310678be-9ef6-41a7-a12a-b2417de4a79f"), как я могу увидеть это в Clojure REPL (на сервере сторона), значение соответствующего токена защиты от подделки?


person Cedric Martin    schedule 07.04.2017    source источник
comment
Попробуйте прочитать исходный код на github .com / ring-clojure / ring-anti-forgery / blob / master / src / ring /, который не делает ничего особенного. После того, как вы это сделаете, если у вас возникнут конкретные вопросы о механизме, это, вероятно, будет хорошим вопросом.   -  person amalloy    schedule 07.04.2017
comment
@amalloy: ну, я уже читал это и просто не понимаю. И это может быть не из-за того, что я не понимаю не только ring, но и Clojure (что объясняет, почему использование исходного кода мне не помогло и почему я задал этот вопрос). Я думаю, что вопрос, ответ на который помог бы мне понять механизм, был бы следующим: Как я могу из REPL прочитать два разных токена защиты от подделки, когда два пользователя вошли на мой веб-сайт и я знаю их идентификатор кольцевого сеанса? . Это действительно помогло бы мне понять, что происходит под капотом.   -  person Cedric Martin    schedule 07.04.2017


Ответы (1)


Он привязан только к контексту (динамическая среда, текущий стек, если хотите) отдельного запроса. Думайте об этом как о локальной переменной / привязке потока. Вы не находитесь в контексте запроса, глядя на состояние вашего приложения из REPL.

Так должно быть, потому что у каждого пользователя должно быть разное значение. Вы бы смоделировали подобное поведение с помощью явного вызова поиска, если бы вы работали в среде, которая не допускает такого рода управления динамической средой.

Привязка к правильному значению сеанса устанавливается в промежуточном программном обеспечении во время запроса, в настоящее время здесь:

https://github.com/weavejester/ring-anti-forgery/blob/master/src/ring/middleware/anti_forgery.clj#L67

(binding [*anti-forgery-token* (session-token request)]
  ;; ...
  )
person Svante    schedule 07.04.2017
comment
ооо, это что-то совершенно новое для меня. Спасибо за ваше объяснение: теперь это кажется менее загадочным, и я понимаю, почему я продолжал видеть это как несвязанное с REPL. - person Cedric Martin; 08.04.2017
comment
Есть ли способ подключить REPL к конкретному сеансу (локальной разработки), чтобы проверить и поработать с его динамическими переменными? Или это безнадежное дело по причинам, указанным выше? - person Jacob Ford; 08.07.2020
comment
Вы можете создать небольшую тестовую функцию, которая принимает запрос (то есть тестовый обработчик) и обернуть его в промежуточное ПО. - person Svante; 08.07.2020