(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

noir-middleware/app-handler を使って Invalid anti-forgery token でハマるとき

Web Development with Clojure の第 5 章くらいでハマる。

このエラーの文言で CSRF だなってことは簡単にわかるんだけど、解決するのに少し悩んだ。
古いバージョン( 0.8.2 当時)の lib-noir だと ring を直接使っていたので、 ring/ring-anti-forgery が依存性に含められていなかったんだけど、 0.9.0 にするタイミングで ring/ring-defaults を依存性に含めたので書籍通りにやろうとするとエラーに遭遇するわけですね。

github.com

でまぁ、これの解決方法は書籍のヘルプページにもあって以下の通りなんだけど

(use 'ring.util.anti-forgery)
(anti-forgery-field)

Pragmatic Forums | Invalid anti-forgery token on guestbook app

ring.util.anti-forgery を require/use して form-to に (anti-forgery-field) って書くといいよって話なんだけど、疑問だったのは何故 lib-noir がそれを解決してくれないんだっていう話で、 ring/ring-anti-forgery は暗黙的に lib-noir で使われているものでエンドユーザーがそれを意識しないといけないのはおかしいんじゃない?と思ったので PR 投げた。 merge された。

github.com

ので、今後はこういうふうにかけます。

(use 'noir.util.anti-forgery)
(anti-forgery-field)

とまぁこんな感じ :)

追記

初の OSS への Contribution でした。