Контент-фабрика работает с LLM, медиа, семантикой, хранилищами и каналами публикации. У каждого провайдера могут быть токены, API keys, OAuth refresh tokens и webhook URL. Главный принцип: секреты не должны попадать в браузерные ответы, публичный контент, workflow JSON, логи и audit metadata.
Где хранить секреты
Секреты хранятся в credential store или в документированных env-only переменных. Обычные настройки проекта не должны содержать токены. Если настройка нужна браузеру, она не должна быть секретом.
Хороший UI показывает факт наличия credentials, fingerprint, статус и дату проверки, но не raw value. Поле ввода секрета должно быть write-only.
Как отдавать данные в API
Browser API должен возвращать только безопасные поля. Например: provider code, enabled, hasCredentials, lastCheckedAt, runtimeSource. Нельзя возвращать password, token, accessKey, bearer header, encrypted blob или refresh token.
Service endpoints должны использовать scoped service token. Браузерная session не должна заменять service auth для внутренних callback.
Что писать в аудит
Audit event нужен для опасных изменений: создание credentials, ротация, отключение провайдера, callback от внешнего сервиса, публикация. Но metadata должна быть очищена. Пишите тип провайдера, код, projectId, outcome, безопасный fingerprint и причину. Не пишите секреты и полный request body.
Как проверять провайдеры
Проверка провайдера должна быть явной. Если реальный provider не настроен, система должна честно показывать provider_not_configured, а не имитировать успешную работу. Для тестов и локальной разработки используйте mock provider.
Это помогает не путать готовность проекта с наличием интерфейса.
Как работать с ротацией
У каждого секрета должен быть владелец и дата обновления. Для критичных ключей задайте rotation interval и reminder. После ротации проверьте provider health и один безопасный smoke-сценарий.
Не удаляйте старый ключ до проверки нового, если провайдер допускает параллельные ключи.
Частые ошибки
Нельзя хранить токены в project_provider_settings.config, если это поле читается браузером. Нельзя вставлять секреты в Markdown, workflow JSON, PR, чат или скриншот. Нельзя логировать полный ответ внешнего провайдера, если в нём может быть credential.
Безопасная работа с провайдерами - это не отдельная политика. Это часть архитектуры: resolver, API shape, audit, UI и тесты должны поддерживать один и тот же запрет на утечки.