Короткий ответ
Сначала классифицируйте ошибку по коду и этапу отказа: OAuth-токен, developer token, права пользователя на аккаунт или неверный идентификатор клиента требуют разных проверок. Сверьте дату начала сбоя с изменениями токенов, ролей, конфигурации и политики доступа.
Как это работает подробнее
Если ответ указывает на invalid_grant, проверьте, не отозван ли refresh token, корректны ли OAuth client ID и секрет и не изменилась ли учётная запись. Ошибка developer token относится к статусу или разрешённому уровню доступа; отказ по customer ID часто указывает на права пользователя, связь с управляющим аккаунтом или неверный login-customer-id. В Google Ads API сервисный аккаунт сам по себе не заменяет необходимую OAuth-конфигурацию и доступ.
- Локализация. Запишите endpoint, HTTP-код, API-код ошибки и идентификаторы запроса, но исключите секреты и токены из логов.
- Сравнение. Проверьте теми же учётными данными простой запрос к доступному аккаунту, чтобы отделить аутентификацию от прав на конкретный аккаунт.
Пример кода
classify_auth_error.py
def classify_error(message):
text = message.lower()
if "invalid_grant" in text or "refresh token" in text:
return "Проверьте OAuth-доступ и refresh token"
if "developer token" in text:
return "Проверьте статус и доступ developer token"
if "customer" in text or "permission" in text:
return "Проверьте права на аккаунт и login-customer-id"
return "Сверьте HTTP-код, API-код и журнал изменений"Что использовать на практике
- Проверяйте по слоям. Начните с конфигурации и токенов, затем статуса developer token, после этого ролей пользователя и связи MCC.
- Восстановление. Перевыпускайте только тот credential, который диагностирован как причина, и повторно тестируйте запрос с минимальными правами.
Подводные камни
- Не путайте причины. Ошибка авторизации и запрет доступа к конкретному аккаунту часто выглядят похоже, но исправляются по-разному.
- Не логируйте секреты. Полный текст заголовка Authorization или токена не должен попадать в журналы и тикеты.