クラウド時代のWebアプリケーション・スマートフォンアプリを開発・運用する会社です。 03-4577-8680 03-6673-4950

Go のフレームワーク echo でCSRFミドルウェアを使う(1)CSRFトークンを取り出す

2017-08-11

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トークンを取得することができました。

これが正規の方法かどうか判断つかないのですが…

無理矢理ではないので、当座これで個人的には納得しています。