diff --git a/app/auth/jwt.go b/app/auth/jwt.go index 168af0e..5a904c6 100644 --- a/app/auth/jwt.go +++ b/app/auth/jwt.go @@ -80,8 +80,9 @@ var nubesAPIEndpoints = []string{ // PingNubesAPI — проверяет валидность токена перебором стендов Nubes API. // endpoint (если задан через NUBES_ENDPOINT) пробуется первым. -// Логика: 401/403 → токен отклонён ЭТИМ стендом, пробуем следующий. -// Любой другой HTTP статус → токен принят. +// Логика: токен принимается ТОЛЬКО при явном HTTP 2xx от стенда. +// 401/403 → токен отклонён ЭТИМ стендом (ErrTokenRejected), пробуем следующий. +// Любой другой статус (4xx/5xx) → стенд НЕ подтвердил токен, пробуем следующий. func PingNubesAPI(ctx context.Context, endpoint, token string) error { candidates := make([]string, 0, len(nubesAPIEndpoints)+1) if endpoint != "" { @@ -111,11 +112,16 @@ func PingNubesAPI(ctx context.Context, endpoint, token string) error { } resp.Body.Close() + // Принимаем токен ТОЛЬКО при явном 2xx: никакой другой статус (5xx, + // 429, редирект и т.п.) не должен считаться подтверждением валидности. + if resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices { + return nil + } if resp.StatusCode == http.StatusUnauthorized || resp.StatusCode == http.StatusForbidden { lastErr = fmt.Errorf("%w (HTTP %d)", ErrTokenRejected, resp.StatusCode) continue } - return nil + lastErr = fmt.Errorf("nubes API %s returned unexpected status HTTP %d", ep, resp.StatusCode) } if lastErr == nil { lastErr = fmt.Errorf("nubes API rejected token")