v0.1.34: кэш валидации JWT (TTL 5 мин + grace 2 мин) — консоль устойчива к флаку шлюза

This commit is contained in:
“Naeel”
2026-08-14 14:09:49 +04:00
parent 0d5dbaba4f
commit 0f24658fc7
5 changed files with 129 additions and 6 deletions
+6 -1
View File
@@ -9,6 +9,7 @@ import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"net/http"
"strings"
@@ -64,6 +65,10 @@ func ParseJWTClaims(token string) (*JWTClaims, error) {
return &claims, nil
}
// ErrTokenRejected — шлюз явно отклонил токен (401/403).
// Sentinel, чтобы отличать отказ от сетевых ошибок (см. cache.go).
var ErrTokenRejected = errors.New("token rejected by nubes API")
// nubesAPIEndpoints — стенды Nubes API Gateway, по которым валидируется токен.
// Токен принимается, если ХОТЯ БЫ ОДИН стенд его принял.
// Юзер может вводить токен от любого стенда — главное, что токен действительный.
@@ -107,7 +112,7 @@ func PingNubesAPI(ctx context.Context, endpoint, token string) error {
resp.Body.Close()
if resp.StatusCode == http.StatusUnauthorized || resp.StatusCode == http.StatusForbidden {
lastErr = fmt.Errorf("nubes API rejected token (HTTP %d)", resp.StatusCode)
lastErr = fmt.Errorf("%w (HTTP %d)", ErrTokenRejected, resp.StatusCode)
continue
}
return nil