echo はリファレンスやgodocもあるので、読めばだいたい書けます。
しかし特にミドルウェアの挙動については、リファレンスを見てもいまいちわからない箇所があったりするわけですが、そういう場合でもソースを読んで把握することはそこまでハードなことではありません。
ということで、今回はechoのCSRFミドルウェアについて、リファレンスではわからなかった挙動を、ソースを読んで調べてみるシリーズです。
第1回は、CSRFトークンのハンドラー内での取り出し方です。
リファレンスに
CSRF token can be accessed from Echo#Context using ContextKey and passed to the client via template.
と書かれているので、echo.Contextに入っているようです。
まず先にContextKeyがecho.Contextに追加されている箇所を追ってみると、
https://github.com/labstack/echo/blob/master/middleware/csrf.go#L166
でSet()されているのがわかります。
このSet()は
https://github.com/labstack/echo/blob/master/context.go#L99
で定義されていますが、そのすぐ上にGet()が定義されています。
https://github.com/labstack/echo/blob/master/context.go#L96
ということで、Handler内でGet()を使って取り出します。
注意しなければならないのは、Get()の返り値の型はinterface{}なので、型アサーションを使う必要がある点ですね。
func sample_handler(c echo.Context) {
// …
token := c.Get(“csrf”).(string)
// …
}
これで意図通り、CSRFトークンを取得することができました。
これが正規の方法かどうか判断つかないのですが…
無理矢理ではないので、当座これで個人的には納得しています。