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


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#L166Set()されているのがわかります。

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

これが正規の方法かどうか判断つかないのですが… 無理矢理ではないので、当座これで個人的には納得しています。

最新記事

すべて表示

SQLite(sqlite3)で “no such table”

小ネタです。 SQLiteを使っていて "no such table" とエラーが出た場合、 DBファイル名の指定が空になっている、という凡ミスを起こしていないかを確認してみましょう。 ・・・ そういう凡ミスをしてしばし悩んだので… ファイル名の指定が空になっている場合、一時的なインメモリDBとして保存されます(※1)。 つまりDB接続を切断すると中身は消えます。 なので接続

アプリケーションサーバにポートを指定せずに起動すると?

最近、 Goで書かれたアプリケーションサーバが起動しない! ->原因: .env ファイルが欠けていた というドタバタがありました。 結局Goと関係ないですが、この時、 「あまりGoに慣れてないのでGoの問題かと…」「DockerまだよくわかってなくてDockerの問題かと…」 というような声があったのて、あえてGoで検証してみようと思ったわけです。 さて、Goでサーバサイドのシステムを作

GitLab 9.1.2 (MySQL) を 11.4.0 (PostgreSQL) にアップグレード

弊社ではかなり前からGitLab(CE)を自社環境で運用しているのですが、ふと気付くと、バージョンがだいぶ先に行ってしまっていました。 とくに最近のバージョンでは Auto DevOps なども使えるようになっていたりするので、さすがにそろそろキャッチアップしたいと考えたわけです。 現行の環境は次の通りです: GitLab 9.1.2 sameersbn/gitlab 使用 MySQL 5.6