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
}