Nanolier

CognitoのJWTをGo+Ginで検証する

2022/08/13

gin-jwt-cognito というライブラリを使うと簡単に Cognito のトークンを検証することができます。

公式ドキュメントはこちら

パッケージインストール

gin と gin-jwt-cognito をインストールします。

go get github.com/akhettar/gin-jwt-cognito github.com/gin-gonic/gin

認証無しのルーティング定義

ひとまず認証無しのルーティングを定義します

package main

import (
	"github.com/gin-gonic/gin"
)

func getHello(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "hello",
	})
}

func main() {
	router := gin.Default()
	router.GET("/hello", getHello)
	router.Run()
}

ミドルウェアの実装

AuthJWTMiddleware という関数でミドルウェアを取得します

mw, err := jwt.AuthJWTMiddleware(<iss>, <ユーザープールID>, <リージョン>)

if err != nil {
	panic(err)
}

iss には以下の URL を入れれば OK です

https://cognito-idp.<リージョン>.amazonaws.com/<ユーザープールID>

ルートに認証処理を入れる

ルートのミドルウェアで先ほど取得した認証ミドルウェアを使用します。
hello/auth が認証が必要なルートです。

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/akhettar/gin-jwt-cognito"
)

func getHello(c *gin.Context) {
	c.JSON(200, gin.H{
		"message": "hello",
	})
}

func main() {
	mw, err := jwt.AuthJWTMiddleware(<iss>, <ユーザープールID>, <リージョン>)

	if err != nil {
		panic(err)
	}

	router := gin.Default()

	router.GET("/hello", getHello)
	router.GET("/hello/auth", mw.MiddlewareFunc(), getHello)

	router.Run()
}

認証できるか確認

以下のコマンドで gin のサーバーが localhost:8080 で立ち上がります

go run main.go

postman で認証あり、なしそれぞれ API を叩いてみます。

/hello

認証無し

レスポンスが返って来ました。

/hello/auth

トークンを Header に付与せずに叩いてみます。

認証あり(トークン未送信)

401 エラーが返って来ました。
認証するためには Headers の「Authentication」に JWT トークンを付与する必要があります。

アクセストークンを取得して再度叩いてみます。

認証あり(トークン送信)

今度はレスポンスが返って来ました。
以上となります。お疲れ様でした。