在Go 中驗證AWS Cognito JWT 令牌
簡介
從J🎜>從JWT 驗證和驗證提取資訊Amazon Cognito 發行的令牌在Go 中可能是一個挑戰。本文提供了有效處理此任務的簡明指南。
先決條件
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json
AWS Cognito 使用者必須從JWKS 終端節點擷取公用JSON Web 金鑰(JWK) 集:
解析JWK並驗證JWT[jwt-go](https://github.com/dgrijalva/jwt-go):用於JWT驗證
解析JWT token 時將公鑰分配給func(token *jwt.Token) (interface{}, error) 回呼。
package main import ( "fmt" jwt "github.com/dgrijalva/jwt-go" "github.com/lestrrat-go/jwx/jwk" ) func main() { // Replace with your Cognito token and Cognito JWKS endpoint tokenString := "YOUR_JWT_TOKEN" endpoint := "YOUR_COGNITO_JWKS_ENDPOINT" keySet, err := jwk.Fetch(endpoint) if err != nil { fmt.Println(err) return } // Parse the JWT token and validate its signature using the public key token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodRS256); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } kid, ok := token.Header["kid"].(string) if !ok { return nil, errors.New("kid header not found") } keys := keySet.LookupKeyID(kid) if !ok { return nil, fmt.Errorf("key with specified kid is not present in jwks") } var publickey interface{} err = keys.Raw(&publickey) if err != nil { return nil, fmt.Errorf("could not parse pubkey") } return publickey, nil }) if err != nil { fmt.Println(err) return } // Access the claims from the validated JWT token claims := token.Claims.(jwt.MapClaims) fmt.Println("User ID: ", claims["sub"]) }
範例程式碼
結論透過利用jwk 和jj-wtgo 等庫,開發jwt-go人員可以在Go 中有效地驗證和檢索Cognito JWT令牌中的數據,提供一種安全、便捷的方式來對應用程式中的使用者進行身份驗證。以上是如何在 Go 中驗證 AWS Cognito JWT 令牌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!