Pular para o conteúdo
ecdsa.com
golang-jwt/jwt (Go)Go

Mensagem de erro

token has invalid claims: token is expired

Também aparece como

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

O golang-jwt v4 imprime “Token is expired” (com T maiúsculo). Os outros erros de claims da v5 usam o mesmo prefixo “token has invalid claims:”.

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

O que significa

A assinatura do token foi verificada, mas a claim `exp` dele está no passado (além de qualquer tolerância que você tenha configurado). O golang-jwt v5 informa isso como `ErrTokenInvalidClaims` combinado com `ErrTokenExpired`; a mesma família gera “token is not valid yet” para um `nbf` no futuro e “token used before issued” para um `iat` no futuro. O token analisado ainda é retornado junto com o erro, mas não se deve confiar nele.

Por que acontece

Como corrigir

  1. 1.

    Detectar a expiração e deixar o cliente renovar o token

    Mapeie `ErrTokenExpired` para 401 com a indicação `invalid_token`. O cliente então usa o token de atualização (ou se autentica de novo) e tenta outra vez.

    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.

    Tolerar uma pequena diferença de relógio e exigir o exp

    Uma tolerância de alguns segundos absorve a diferença entre os relógios das máquinas. `WithExpirationRequired` fecha a brecha oposta: sem ele, tokens sem `exp` nunca expirariam.

    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
    )

Erros relacionados

Ver toda a base de erros de assinatura