0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

echoを使ったAPIキー認証のサンプル

Posted at

概要

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 機能を使えば簡単に分けられそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?