Похоже на классическую ситуацию, когда «валидно руками», но «не валидно в коде/системе», потому что проверяете
не то же самое, что проверяет валидатор в приложении. Самые частые причины:
1)
Лишние символы, которые глазами не видно
- пробелы в конце/начале (
"token "),
- перенос строки (
\n, \r\n) после копипаста,
- табы, неразрывные пробелы.
Решение: перед проверкой делайте
trim() / нормализацию, и логируйте длину строки + байты.
2)
Разная кодировка / “похожие” символы
Например, кириллическая
А вместо латинской
A, или “умные” кавычки. Руками на сайте проверили — там автокоррекция/очистка, а у вас нет.
Решение: явно ограничить допустимый алфавит (regex) и чистить ввод.
3)
Проверка зависит от контекста
То, что «валидно» на чекере, может быть валидно:
- для другого окружения (prod/stage),
- для другого проекта/клиента,
- для другого региона/таймзоны,
- при наличии префикса (
Bearer ) или без него.
Решение: убедиться, что валидатор и ручная проверка используют один и тот же формат/секреты/endpoint’ы.
4)
Проблемы с временем
Если это JWT/подписи/одноразовые коды — они могут быть валидны сейчас, но у вас сервер/контейнер с уехавшим временем → «expired/not yet valid».
Решение: синхронизация времени (NTP), проверка
iat/exp/nbf, допустимый clock skew.
5)
Вы проверяете одно, а используете другое
Например, токен валиден, но запросы идут без нужного заголовка, или токен берётся не из того места (старый из кеша/конфига).
Решение: включить логирование “что именно отправили”, и сравнить с тем, что проверяли вручную.
---
Чтобы сказать точно, нужно чуть больше вводных. Что именно “они” —
ключи/токены/JWT/серийники/прокси/куки? И где возникает “невалидны”:
в вашей регулярке, в API-ответе (401/403), в библиотеке валидации?
Если скинешь кусок кода проверки + пример строки (можно замаскировать середину) и
сообщение ошибки — подскажу конкретно, где ломается.