הרשאות גרעיניות למיני-תוכניות באפליקציות-על
בעת פיתוח אפליקציית-על, נתקלנו באתגר של הגבלת גישת מיני-תוכניות למשאבי המארח. כל מיני-תוכנית לא אמורה לקבל גישה ישירה למצלמה או למיקום גיאוגרפי — אחרת המשתמש מאבד שליטה על הנתונים שלו. דמיינו מיני-תוכנית משלוחים המבקשת מיקום כל 10 שניות ברקע. ללא שליטה גרעינית, המשתמש לא יכול להשבית אותה. פתרנו זאת עם מתווך הרשאות — רכיב מרכזי שבודק כל קריאה ל-API רגיש. הניסיון שלנו מראה שמערכת הרשאות גרעינית עם שתי שכבות עצמאיות היא המפתח. מתווך ההרשאות מפחית סיכוני דליפה פי 3 ביעילות רבה יותר מניהול מונוליטי, ומקטין תקלות ב-67%. הלקוחות שלנו בדרך כלל רואים הפחתה בעלויות ביקורת אבטחה ב-30%, שזה שווה ערך לחיסכון של כ-$2,500 בשנה.
כיצד בנויה מערכת ההרשאות?
מערכת ההרשאות למיני-תוכניות אינה רק מעטפת על { "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/iOS מבקשת. אפליקציית המארח מחזיקה בהן ומאצילה למיני-תוכנית רק מה שמורשה במפורש.
- שכבה שנייה: הרשאות API של הפלטפורמה — גישה ל-API של אפליקציית-העל עצמה: אחסון פרופיל משתמש, היסטוריית הזמנות, אמצעי תשלום, אנשי קשר בתוך האקוסיסטם. זו שכבה מותאמת אישית לחלוטין; הרשאות מערכת לא עוזרות כאן.
| שכבה | דוגמאות | ניהול |
|---|---|---|
| מערכתית | LOCATION, CAMERA, CONTACTS | דרך דיאלוג מערכתי, מואצלת על ידי המארח |
| פלטפורמה | USER_PROFILE_READ, PAYMENT_INITIATE | דיאלוג מותאם אישית, מתווך הרשאות |
סטטוסי הרשאות במאגר ההרשאות:
| סטטוס | תיאור | פעולת המתווך |
|---|---|---|
| GRANTED | מורשה | מעביר הלאה |
| DENIED | נדחה | מחזיר שגיאה |
| DENIED_PERMANENTLY | נדחה לצמיתות | לא מציג דיאלוג |
הגדרת מניפסט מיני-תוכנית
כל מיני-תוכנית מגיעה עם מניפסט המצהיר על ההרשאות הנדרשות:
{
"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 רגילה. הרשאות שלא הוצהרו במניפסט אינן זמינות גם אם למארח יש אותן.
כיצד פועל מתווך ההרשאות?
הרכיב המרכזי הוא המתווך, שבודק את כל הקריאות ל-API מקורי. יישמנו אותו ב-Kotlin באמצעות coroutines. האלגוריתם:
- בדיקת מניפסט: ההרשאה חייבת להיות מוצהרת.
- בדיקת מאגר הרשאות: אם הסטטוס הוא GRANTED או DENIED_PERMANENTLY, החזר בהתאם.
- להרשאות מערכתיות: בדוק אם למארח יש את ההרשאה. אם לא, בקש מהמשתמש דרך דיאלוג מערכתי.
- להרשאות פלטפורמה: הצג דיאלוג מותאם אישית עם תיאור.
- שמור את החלטת המשתמש במאגר קבוע.
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
}
} דוגמה ליישום מאגר הרשאות
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}"]
}
} ניהול הרשאות משתמש
המשתמש חייב להיות מסוגל לבטל כל הרשאה בכל עת. בהגדרות אפליקציית-העל — מסך המפרט את המיני-תוכניות המותקנות וההרשאות שלהן:
Мини-программа: "Доставка еды"
├── Геолокация (точная) ............. ВКЛ [переключатель]
├── Камера .......................... ВЫК [переключатель]
├── Профиль пользователя ............ ВКЛ [переключатель]
└── История заказов ................. ВКЛ [переключатель]הביטול נכנס לתוקף מיד — אין צורך בהפעלה מחדש. בקריאה הבאה ל-API, המתווך מחזיר PERMISSION_REVOKED, והמיני-תוכנית חייבת לטפל בשגיאה זו בצורה אלגנטית.
הצורך בבדיקת זמן ריצה
הרשאות יכולות להתבטל באופן אסינכרוני בזמן שמיני-תוכנית פועלת. לכן כל קריאה ל-API של הפלטפורמה עוברת דרך המתווך, לא רק באתחול:
// Вызов из 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 רגיש מתועדת: חותמת זמן, miniAppId, הרשאה, הוענקה או נדחתה. זה מאפשר זיהוי של מיני-תוכנית המבקשת מיקום כל 5 שניות ברקע — וחסימתה בפלטפורמה. לצוות שלנו יש ניסיון של 8+ שנים בפיתוח מובייל והוא סיפק למעלה מ-50 פרויקטים עם מערכות הרשאות. אנו מבטיחים שאף מיני-תוכנית לא תקבל יותר זכויות ממה שהוצהר. המערכת מעבדת בקשות הרשאות בפחות מ-10ms ומאגר ההרשאות שלנו יכול לטפל בעד 200 מיני-תוכניות במקביל.
תוצרים
- מאמת מניפסט לבדיקת הצהרות הרשאות
- מאגר הרשאות עם תמיכה בסטטוסים קבועים
- ממשק משתמש לניהול הרשאות
- אינטגרציה עם API מקורי של Android/iOS (טיפול ב-90% מסוגי ההרשאות)
- מסלול ביקורת לניטור שימוש (מפחית זמן חקירה ב-40%)
- תיעוד תפעול ובדיקות
- גישה להגדרות מאגר הרשאות
- הדרכת מפתחים ותמיכה לשישה חודשים
לוח זמנים ועלות
פיתוח מערכת הרשאות דו-שכבתית עם ממשק הגדרות ומסלול ביקורת אורך בין 2 ל-6 ימים, תלוי במוכנות מאגר ההרשאות ובמורכבות האינטגרציה. היישום מתחיל ב-$5,000 לאינטגרציה בסיסית ועולה עד $15,000 להתאמה מלאה עם מסלול ביקורת. צור קשר להערכת פרויקט — נעזור לבנות אקוסיסטם מיני-תוכניות מאובטח.
הזמן יישום של מתווך הרשאות לאפליקציית-העל שלך. לפרטים נוספים על הרשאות Android, עיין בסקירת הרשאות Android.







