Go

CognitoのJWTの検証は公式ドキュメントの通りに行う JSON web トークンの検証 - Amazon Cognito

今回は https://github.com/lestrrat-go/jwx を使う

import (
	"context"
	"fmt"
 
	"github.com/lestrrat-go/jwx/jwk"
	"github.com/lestrrat-go/jwx/jwt"
)
 
func ValidateJwt(tokenString string) error {
 
	fmt.Printf("%v\n", tokenString)
 
    // jwkを取得する
	keySet, err := jwk.Fetch(context.Background(), fmt.Sprintf("https://cognito-idp.%s.amazonaws.com/%s/.well-known/jwks.json", "region", "userId"))
	if err != nil {
		return err
	}
 
    // 検証
	token, err := jwt.Parse([]byte(tokenString), jwt.WithKeySet(keySet), jwt.WithValidate(true))
	if err != nil {
		fmt.Printf("%v\n", err)
		return err
	}
 
    // aud の値がcliend_idと一致するか検証
	if token.Audience()[0] != "my_client_id" {
		return ErrClientId
	}
    // iss の値がuserpool_idと一致するか検証
	if token.Issuer() != "userpoolId" {
		return ErrClientId
	}
    // token_use の値がaccessか検証
	if tokenUse, ok := token.Get("token_use"); ok {
		if tokenUseStr, ok := tokenUse.(string); ok && tokenUseStr != "access" {
			return ErrTokenUse
		}
	}
	return nil
 
 
	return nil
}