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 トークンを付与する必要があります。
アクセストークンを取得して再度叩いてみます。
今度はレスポンスが返って来ました。
以上となります。お疲れ様でした。