Go で JWK を使用して JWT 署名を検証するにはどうすればよいですか?
JWT を認証する際の課題の 1 つは、署名の検証です。これは、JWK と Go 言語に特に当てはまります。
問題
デコーダーを使用すると、JWT を解析できます。ただし、特に JWK を使用した場合の署名の検証には、別の課題が伴います。一般的なエラーの例を次に示します。
type myClaims struct { jwt.StandardClaims } func main() { claims := &myClaims{} _, err := jwt.ParseWithClaims("ey...", claims, getKey) if err != nil { log.Fatal(err) } }
エラー: キー "kid" がトークン内に見つかりません
解決策
これを解決するには、公開キーを取得する Keyfunc を提供する必要があります。次のコードは、解決策を示しています。
const jwksURL = "https://companyx.okta.com/oauth2/v1/keys" func getKey(token *jwt.Token) (interface{}, error) { // TODO: Cache the response to avoid repeated HTTP requests set, err := jwk.FetchHTTP(jwksURL) if err != nil { return nil, err } keyID, ok := token.Header["kid"].(string) if !ok { return nil, errors.New("expecting JWT header to have string kid") } if key := set.LookupKeyID(keyID); len(key) == 1 { return key[0].Materialize() } return nil, fmt.Errorf("unable to find key %q", keyID) }
この getKey 関数:
この getKey 関数を提供することで、Go で JWK を使用して JWT 署名を正常に検証できます。
以上がGo で JWK を使用して JWT 署名を検証する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。