P0.2: JWT принимается только при явном 2xx от Nubes API
Раньше любой статус, кроме 401/403 (включая 5xx/429/редиректы), считался подтверждением токена. Теперь валидность подтверждается только явным 2xx; 401/403 — отклонён, прочие статусы — ошибка стенда (пробуем следующий).
This commit is contained in:
+9
-3
@@ -80,8 +80,9 @@ var nubesAPIEndpoints = []string{
|
|||||||
|
|
||||||
// PingNubesAPI — проверяет валидность токена перебором стендов Nubes API.
|
// PingNubesAPI — проверяет валидность токена перебором стендов Nubes API.
|
||||||
// endpoint (если задан через NUBES_ENDPOINT) пробуется первым.
|
// endpoint (если задан через NUBES_ENDPOINT) пробуется первым.
|
||||||
// Логика: 401/403 → токен отклонён ЭТИМ стендом, пробуем следующий.
|
// Логика: токен принимается ТОЛЬКО при явном HTTP 2xx от стенда.
|
||||||
// Любой другой HTTP статус → токен принят.
|
// 401/403 → токен отклонён ЭТИМ стендом (ErrTokenRejected), пробуем следующий.
|
||||||
|
// Любой другой статус (4xx/5xx) → стенд НЕ подтвердил токен, пробуем следующий.
|
||||||
func PingNubesAPI(ctx context.Context, endpoint, token string) error {
|
func PingNubesAPI(ctx context.Context, endpoint, token string) error {
|
||||||
candidates := make([]string, 0, len(nubesAPIEndpoints)+1)
|
candidates := make([]string, 0, len(nubesAPIEndpoints)+1)
|
||||||
if endpoint != "" {
|
if endpoint != "" {
|
||||||
@@ -111,11 +112,16 @@ func PingNubesAPI(ctx context.Context, endpoint, token string) error {
|
|||||||
}
|
}
|
||||||
resp.Body.Close()
|
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 {
|
if resp.StatusCode == http.StatusUnauthorized || resp.StatusCode == http.StatusForbidden {
|
||||||
lastErr = fmt.Errorf("%w (HTTP %d)", ErrTokenRejected, resp.StatusCode)
|
lastErr = fmt.Errorf("%w (HTTP %d)", ErrTokenRejected, resp.StatusCode)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return nil
|
lastErr = fmt.Errorf("nubes API %s returned unexpected status HTTP %d", ep, resp.StatusCode)
|
||||||
}
|
}
|
||||||
if lastErr == nil {
|
if lastErr == nil {
|
||||||
lastErr = fmt.Errorf("nubes API rejected token")
|
lastErr = fmt.Errorf("nubes API rejected token")
|
||||||
|
|||||||
Reference in New Issue
Block a user