From 12b25e393d9076658a9987d82edba3b9eba95d41 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Tue, 6 Oct 2026 18:04:42 +0300 Subject: [PATCH] =?UTF-8?q?P0.2:=20JWT=20=D0=BF=D1=80=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=BF=D1=80=D0=B8=20=D1=8F=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=202xx=20=D0=BE=D1=82=20Nubes=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше любой статус, кроме 401/403 (включая 5xx/429/редиректы), считался подтверждением токена. Теперь валидность подтверждается только явным 2xx; 401/403 — отклонён, прочие статусы — ошибка стенда (пробуем следующий). --- app/auth/jwt.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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")