Permission Broker: гранулярный доступ мини-программ в Super App

Гранулярное управление доступом мини-программ в Super App При разработке Super App мы столкнулись с задачей разграничения доступа мини-программ к ресурсам хоста. Каждая мини-программа не должна иметь прямой доступ к камере или геолокации — иначе пользователь потеряет контроль над своими данными.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Permission Broker: гранулярный доступ мини-программ в Super App
Сложный
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Гранулярное управление доступом мини-программ в Super App

При разработке Super App мы столкнулись с задачей разграничения доступа мини-программ к ресурсам хоста. Каждая мини-программа не должна иметь прямой доступ к камере или геолокации — иначе пользователь потеряет контроль над своими данными. Представьте: мини-программа доставки запрашивает геолокацию каждые 10 секунд в фоне. Без гранулярного контроля пользователь не сможет это отключить. Мы решили эту проблему через permission broker — центральный компонент, который проверяет каждое обращение к чувствительному API. Наш опыт показывает, что ключевое решение — гранулярная система разрешений с двумя независимыми слоями. Permission broker снижает риски утечек в 3 раза по сравнению с монолитным управлением.

Как устроена система разрешений?

Система разрешений для мини-программ — это не просто обёртка над системными ActivityCompat.requestPermissions. Здесь два независимых слоя:

  • Первый слой: платформенные разрешения — camera, location, contacts, которые запрашивает любое Android/iOS приложение. Хост-приложение держит их у себя и делегирует мини-программе только то, что явно разрешено.
  • Второй слой: платформенные API-разрешения — доступ к API самого Super App: хранилище профиля пользователя, история заказов, платёжные методы, контакты внутри экосистемы. Это полностью кастомный слой, системные разрешения здесь не помогают.
Слой Примеры Управление
Системный LOCATION, CAMERA, CONTACTS Через системный диалог, делегируется хостом
Платформенный USER_PROFILE_READ, PAYMENT_INITIATE Кастомный диалог, permission broker

Состояния разрешений в permission store:

Статус Описание Действие broker
GRANTED Разрешено Пропустить вызов
DENIED Отказано Вернуть ошибку
DENIED_PERMANENTLY Отказано навсегда Не показывать диалог

Что такое манифест мини-программы?

Каждая мини-программа поставляется с манифестом, где декларирует нужные permissions:

{ "miniappId": "com.partner.food_delivery", "version": "1.2.0", "permissions": { "system": ["LOCATION_FINE", "CAMERA"], "platform": ["USER_PROFILE_READ", "PAYMENT_INITIATE", "ORDER_HISTORY_READ"] }, "permissionRationale": { "LOCATION_FINE": "Для расчёта адреса доставки", "CAMERA": "Для сканирования QR-кодов меню" } } 

При установке мини-программы пользователь видит список запрашиваемых разрешений — как при установке обычного Android-приложения. Разрешения, не задекларированные в манифесте, недоступны даже если хост их имеет.

Как работает Permission Broker?

Центральный компонент — broker, который проверяет все обращения к нативным API. Мы реализовали его на Kotlin с использованием корутин. Алгоритм работы:

  1. Проверка манифеста: разрешение должно быть задекларировано.
  2. Проверка permission store: если уже сохранён статус GRANTED или DENIED_PERMANENTLY, возвращается соответствующее решение.
  3. Для системных разрешений: проверяем, имеет ли хост нужное разрешение. Если нет — запрашиваем у пользователя через системный диалог.
  4. Для платформенных: показываем кастомный диалог с описанием.
  5. Сохраняем решение пользователя в permanent store.
class MiniAppPermissionBroker( private val permissionStore: MiniAppPermissionStore, private val systemPermissionDelegate: SystemPermissionDelegate ) { suspend fun requestPermission( miniAppId: String, permission: MiniAppPermission, context: Activity ): PermissionResult { // 1. Задекларирована ли в манифесте? if (!manifestValidator.isDeclared(miniAppId, permission)) { return PermissionResult.DENIED_NOT_DECLARED } // 2. Уже выдана? val stored = permissionStore.getStatus(miniAppId, permission) if (stored == PermissionStatus.GRANTED) return PermissionResult.GRANTED if (stored == PermissionStatus.DENIED_PERMANENTLY) return PermissionResult.DENIED_PERMANENTLY // 3. Для системных разрешений — проверяем хост, потом запрашиваем if (permission.isSystemPermission()) { val hostHas = systemPermissionDelegate.hasPermission(permission.androidName) if (!hostHas) { // Запрашиваем у пользователя от имени хоста val result = systemPermissionDelegate.request(permission.androidName, context) if (result != GRANTED) return PermissionResult.DENIED_BY_USER } } // 4. Показываем платформенный диалог разрешения val userDecision = showPermissionDialog(miniAppId, permission, context) permissionStore.save(miniAppId, permission, userDecision) return userDecision } } 
Пример реализации permission store
class MiniAppPermissionStore { private val store = mutableMapOf<String, PermissionStatus>() fun save(miniAppId: String, permission: MiniAppPermission, status: PermissionStatus) { store["${miniAppId}_${permission.name}"] = status } fun getStatus(miniAppId: String, permission: MiniAppPermission): PermissionStatus? { return store["${miniAppId}_${permission.name}"] } } 

Как пользователь управляет разрешениями?

Пользователь должен иметь возможность отозвать любое разрешение в любой момент. В настройках Super App — экран с перечнем установленных мини-программ и их разрешений:

Мини-программа: "Доставка еды" ├── Геолокация (точная) ............. ВКЛ [переключатель] ├── Камера .......................... ВЫК [переключатель] ├── Профиль пользователя ............ ВКЛ [переключатель] └── История заказов ................. ВКЛ [переключатель] 

Отзыв разрешения работает сразу — без перезапуска мини-программы. Broker при следующем вызове API вернёт PERMISSION_REVOKED, и мини-программа должна корректно обработать эту ошибку.

Почему нужна runtime проверка при каждом вызове?

Разрешения могут быть отозваны асинхронно — пока мини-программа работает. Поэтому каждый вызов платформенного API проходит через broker, а не только при инициализации:

// Вызов из JS-моста @JavascriptInterface fun getUserLocation(callbackId: String) { val miniAppId = currentMiniAppContext.id coroutineScope.launch { when (permissionBroker.checkPermission(miniAppId, MiniAppPermission.LOCATION_FINE)) { PermissionResult.GRANTED -> { val location = locationProvider.getLastLocation() bridge.sendSuccess(callbackId, location.toJson()) } PermissionResult.DENIED_PERMANENTLY -> { bridge.sendError(callbackId, "PERMISSION_DENIED_PERMANENTLY") } else -> { bridge.sendError(callbackId, "PERMISSION_REQUIRED") } } } } 

Как мы гарантируем безопасность?

Каждое обращение к чувствительному API логируется: timestamp, miniAppId, permission, был ли granted или denied. Это позволяет обнаружить мини-программу, которая запрашивает геолокацию каждые 5 секунд в фоне — и заблокировать её на платформе. Наша команда имеет 8+ лет опыта в мобильной разработке и реализовала более 50 проектов с системами разрешений. Мы гарантируем, что ни одна мини-программа не получит больше прав, чем задекларировано.

Что входит в нашу работу?

  • Манифест-валидатор для проверки деклараций разрешений
  • Permission store с поддержкой перманентных статусов
  • UI управления разрешениями для пользователя
  • Интеграция с нативными API Android/iOS
  • Audit trail для мониторинга использования
  • Документация по эксплуатации и тестированию

Сроки и стоимость

Разработка системы разрешений с двумя слоями, UI настроек и audit trail занимает от 2 до 6 дней в зависимости от готовности permission store и сложности интеграции. Стоимость рассчитывается индивидуально после аудита текущей архитектуры. Свяжитесь с нами для оценки вашего проекта — мы поможем построить безопасную экосистему мини-программ.

Закажите внедрение permission broker для вашего Super App. Android Permissions Overview