Saltar al contenido
ecdsa.com
coreos/go-oidc (Go)Go

Mensaje de error

failed to verify signature: failed to verify id token signature

También se muestra como

  • failed to verify signature: fetching keys oidc: get keys failed

Cuando falla la propia solicitud del JWKS, el texto es «failed to verify signature: fetching keys oidc: get keys failed …», seguido del error HTTP o de red.

coreos/go-oidc (Go) — IDTokenVerifier.Verify with a RemoteKeySet

Qué significa

go-oidc descargó el conjunto de claves del proveedor (con una segunda descarga si el `kid` era desconocido) y ninguna clave publicada verificó la firma del token. go-oidc no distingue entre «no hay ninguna clave con este kid» y «hay una clave con este kid, pero la firma no coincide»: en ambos casos, el token no se firmó con una clave que este proveedor publique actualmente. Si no se pudo descargar el conjunto de claves en absoluto, el mensaje continúa con «fetching keys …».

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Crear el verificador a partir del descubrimiento

    `provider.Verifier` usa el `jwks_uri` del documento de descubrimiento del proveedor y el emisor del proveedor, con lo que las URL configuradas a mano dejan de ser una fuente de discrepancias.

    go
    provider, err := oidc.NewProvider(ctx, "https://accounts.example.com") // discovery gives the right jwks_uri
    if err != nil {
    	return err
    }
    verifier := provider.Verifier(&oidc.Config{ClientID: clientID})
    idToken, err := verifier.Verify(ctx, rawIDToken)
  2. 2.

    Comparar el kid del token con las claves publicadas

    Si el `kid` no está publicado, el token es ajeno o el proveedor no ha terminado una rotación. Si está publicado, la clave que hay detrás no firmó este token.

    bash
    # kid in the token header vs kids the provider publishes
    python3 -c 'import base64,json,sys; h=sys.argv[1].split(".")[0]; print(json.loads(base64.urlsafe_b64decode(h+"="*(-len(h)%4))))' "$ID_TOKEN"
    curl -s "$(curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .jwks_uri)" | jq '.keys[] | {kid, alg, kty}'

Errores relacionados

Explorar toda la base de datos de errores de firma