Aller au contenu
ecdsa.com
golang-jwt/jwt (Go)Go

Message d’erreur

token has invalid claims: token is expired

Également affiché sous la forme

  • Token is expired
  • token has invalid claims: token is not valid yet
  • token has invalid claims: token used before issued

golang-jwt v4 affiche « Token is expired » (avec un T majuscule). Les autres erreurs de claims de la v5 utilisent le même préfixe « token has invalid claims: ».

golang-jwt/jwt (Go) — jwt.ErrTokenInvalidClaims joined with jwt.ErrTokenExpired

Ce que cela signifie

La signature du jeton a été vérifiée, mais son claim `exp` se situe dans le passé (au-delà de toute tolérance que vous avez configurée). golang-jwt v5 le signale par `ErrTokenInvalidClaims` combiné à `ErrTokenExpired` ; la même famille d’erreurs produit « token is not valid yet » pour un `nbf` situé dans le futur et « token used before issued » pour un `iat` situé dans le futur. Le jeton analysé est tout de même renvoyé avec l’erreur, mais il ne doit pas être considéré comme fiable.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Détecter l’expiration et laisser le client actualiser le jeton

    Convertissez `ErrTokenExpired` en réponse 401 accompagnée de l’indication `invalid_token`. Le client utilise alors son jeton d’actualisation (ou se réauthentifie), puis réessaie.

    go
    token, err := jwt.Parse(raw, keyfunc, jwt.WithValidMethods([]string{"ES256"}))
    if errors.Is(err, jwt.ErrTokenExpired) {
    	w.Header().Set("WWW-Authenticate", `Bearer error="invalid_token", error_description="token expired"`)
    	http.Error(w, "token expired", http.StatusUnauthorized) // client refreshes and retries
    	return
    }
  2. 2.

    Tolérer un faible décalage d’horloge, exiger exp

    Une tolérance de quelques secondes absorbe la dérive entre machines. `WithExpirationRequired` comble la faille inverse : sans cette option, les jetons dépourvus de `exp` n’expireraient jamais.

    go
    parser := jwt.NewParser(
    	jwt.WithValidMethods([]string{"ES256"}),
    	jwt.WithLeeway(30*time.Second), // absorbs clock skew for exp, nbf and iat
    	jwt.WithExpirationRequired(),   // tokens without exp are rejected too
    )

Erreurs associées

Parcourir toute la base de données des erreurs de signature