Ответ вслух Senior Сборка и публикация обновлено

Конфигурация и секреты в мобильном приложении

Вопрос

Как вы разводите окружения и обращаетесь с секретами во Flutter-приложении?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Адреса API, ключи аналитики и флаги передаю через --dart-define-from-file, у каждого окружения свой JSON, а идентификатор приложения, имя и иконку разводят flavors. Важный принцип: всё, что попало в приложение, публично.

Что должно прозвучать в ответе

  • `--dart-define`/`--dart-define-from-file` для адресов и флагов, flavors для идентификаторов и иконок

  • Всё, что в приложении, считается публичным: обфускация не защищает строки

  • Секретные операции на сервере, клиент получает временные токены

  • Хранение токенов пользователя в Keychain/Keystore (`flutter_secure_storage`)

  • Удалённая конфигурация и feature-флаги для управления без релиза

Что могут спросить следом

  • Как защитить API от запросов не из вашего приложения?
  • Где хранить refresh-токен?

Разбор

Образцовый ответ: «Адреса API, ключи аналитики и флаги передаю через --dart-define-from-file, у каждого окружения свой JSON, а идентификатор приложения, имя и иконку разводят flavors. Важный принцип: всё, что попало в приложение, публично. Обфускация переименовывает символы, но строки остаются, их можно вытащить. Поэтому приватные ключи, например платёжного провайдера, живут только на сервере, а приложение получает от него короткоживущие токены. Токены пользователя храню в Keychain и Keystore через flutter_secure_storage, а не в SharedPreferences. Чтобы менять поведение без релиза, использую удалённую конфигурацию и feature-флаги. Для защиты API от чужих клиентов есть проверки целостности приложения, например Play Integrity и App Attest, но они не заменяют авторизацию»

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.