概要
echoの使い方を勉強してみるがてら、APIキーによる認証を作ってみようと思い取り組んでみました。
APIキーによる認証の考え方がGCPのドキュメントにまとめられていたのでリンク置いときます。
やってみた
リクエストヘッダに X-API-KEY
としてAPIキーが付与されるものとして、curlで以下のようなリクエストを送る想定です。
ターミナル
curl -H 'X-API-KEY:testkey' localhost:8080/hello
echoのミドルウェアを使ってみる
main.go
package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func main() {
e := echo.New()
// APIキーチェック
e.Use(middleware.KeyAuthWithConfig(middleware.KeyAuthConfig{
KeyLookup: "header:X-API-KEY",
Validator: func(key string, c echo.Context) (bool, error) {
return key == "testkey", nil
},
}))
e.GET("/hello", hello)
e.Logger.Fatal(e.Start(":8080"))
}
func hello(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"message": "Hello World"})
}
- 参考ドキュメント
KeyLookup:
の部分に取得したいヘッダーのフィールド名を指定します。
ヘッダーだけでなく、クエリ、クッキー、フォームの値も取得できるみたいです。
指定しない場合はデフォルトで header:Authorization
の値を取得しようとします。
Validator:
の部分では、リクエストされたキーと実際のキーを比較します。
サンプルのため、APIキーをハードコーディングしてますが本来は適切に取得した上で比較します。
自作ミドルウェアを使ってみる
main.go
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
// APIキーチェック
e.Use(checkAPIKeyMiddleware)
e.GET("/hello", hello)
e.Logger.Fatal(e.Start(":8080"))
}
func hello(c echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{"message": "Hello World"})
}
func checkAPIKeyMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
reqKey := c.Request().Header.Get("X-API-KEY")
if reqKey != "testkey" {
return c.JSON(http.StatusUnauthorized, map[string]string{"message": http.StatusText(http.StatusUnauthorized)})
}
return next(c)
}
}
シンプルに「ヘッダーの特定のフィールドを取得する」方法がわからなくて困ってたんですが、こんなわかりやすい形で取得できるんですね。
reqKey := c.Request().Header.Get("X-API-KEY")
あとがき
ミドルウェアを使って簡単に実装できました。
またミドルウェアを通すAPIと通さないAPIは echo の Group
機能を使えば簡単に分けられそうです。