Ми — команда мобільних розробників з 10+ річним досвідом інтеграції корпоративних систем. Пряма LDAP-інтеграція в мобільному застосунку — майже завжди архітектурна помилка: порти 389/636 закриті файрволом, LDAP-bind credentials не можна зберігати на пристрої, з'єднання через мобільний інтернет до on-premise AD нестабільне. Правильна схема — backend-проксі: мобільний → backend API → AD/LDAP. Це гарантує безпеку та масштабованість. Ми реалізуємо інтеграцію під ключ, використовуючи сучасні протоколи та шифрування. Наші сертифіковані інженери проведуть аудит вашої інфраструктури та запропонують оптимальне рішення. Замовте консультацію — оцінимо проект безкоштовно.
Чому не можна підключатися до LDAP напряму з мобільного?
Мобільні мережі непередбачувані, а корпоративні LDAP-сервери знаходяться за суворим файрволом. При спробі прямого з'єднання ви зіткнетеся з мережевими блокуваннями, вимогою відкривати порти (що порушує політики безпеки) і вразливістю зберігання облікових даних на пристрої. Навіть при використанні VPN додадуться затримки та складність керування. Backend-проксі вирішує ці проблеми: всі з'єднання ініціюються із захищеного сегмента мережі, а мобільний застосунок працює тільки через HTTPS з JWT.
Архітектура інтеграції: backend-проксі
Backend виступає LDAP-проксі: приймає запити від мобільного через HTTPS з JWT-авторизацією, звертається до AD/LDAP всередині корпоративної мережі, повертає дані в REST-форматі.
Мобільний ──HTTPS/JWT──► Backend API ──LDAP 636──► Active Directory └──LDAP 389──► OpenLDAP Для аутентифікації через AD на backend використовуємо LDAP-bind:
// Node.js, ldapjs const client = ldap.createClient({ url: "ldaps://dc01.company.local:636", tlsOptions: { rejectUnauthorized: true, ca: [fs.readFileSync("ca.crt")] }, }); async function authenticateUser(username, password) { const userDN = `cn=${username},ou=Users,dc=company,dc=local`; return new Promise((resolve, reject) => { client.bind(userDN, password, (err) => { if (err) { reject(new InvalidCredentialsError()); } else { resolve(true); client.unbind(); } }); }); } Після успішного bind backend генерує JWT і повертає на мобільний. Пароль користувача ніколи не покидає backend.
| Параметр | Прямий доступ | Backend-проксі |
|---|---|---|
| Безпека | Низька: пароль на пристрої | Висока: пароль не зберігається |
| Масштабованість | Обмежена: стабільність мережі | Висока: кешування, балансування |
| Швидкість | Залежить від мережі клієнта | Оптимізована на backend |
| Складність впровадження | Проста, але небезпечна | Потребує розробки |
Як захистити облікові дані користувачів?
Пароль користувача передається від мобільного на backend через HTTPS. Backend виконує LDAP-bind — єдине місце, де пароль використовується. Після підтвердження автентичності backend генерує JWT з обмеженим терміном дії (наприклад, 1 година). Мобільний пристрій зберігає тільки JWT, пароль ніде не кешується. При звільненні співробітника акаунт в AD деактивується, backend при наступному refresh_token виявляє невдалий LDAP lookup та інвалідує JWT — доступ негайно блокується.
Отримання атрибутів користувача
AD зберігає багатий набір атрибутів: displayName, mail, telephoneNumber, department, manager, memberOf (групи), thumbnailPhoto (аватар). Для корпоративного застосунку це цінне джерело даних — не потрібно дублювати профілі користувачів.
async function getUserAttributes(username) { const base = "ou=Users,dc=company,dc=local"; const opts = { filter: `(sAMAccountName=${username})`, scope: "sub", attributes: [ "displayName", "mail", "department", "manager", "memberOf", "thumbnailPhoto", ], }; return new Promise((resolve, reject) => { client.search(base, opts, (err, res) => { let entry = null; res.on("searchEntry", (e) => (entry = e.object)); res.on("end", () => resolve(entry)); res.on("error", reject); }); }); } thumbnailPhoto — це JPEG у base64 прямо в AD. Повертаємо його як base64-рядок або зберігаємо в object storage і повертаємо URL.
memberOf містить DN груп: CN=VPN-Users,OU=Groups,DC=company,DC=local. Групи визначають права користувача в застосунку — парсимо CN з DN і мапимо на application roles.
Як побудувати оргструктуру з AD?
AD містить ієрархію через атрибут manager (DN керівника) та directReports. Побудувати дерево оргструктури через рекурсивні LDAP-запити — можливо, але повільно при глибоких ієрархіях. Краще: кешувати структуру на backend з періодичним оновленням (раз на годину/добу), мобільний запитує готовий граф.
// Android — відображення оргструктури data class OrgNode( val employeeId: String, val name: String, val position: String, val department: String, val avatarUrl: String?, val directReports: List<OrgNode> ) @Composable fun OrgChart(rootNode: OrgNode) { LazyColumn { item { EmployeeCard(node = rootNode, level = 0) } items(rootNode.directReports) { report -> EmployeeCard(node = report, level = 1) // Рекурсивно для вкладених рівнів через expandable state } } } Пошук співробітників
Повнотекстовий пошук по AD через LDAP-фільтр:
const filter = `(&(objectClass=person)(|(displayName=*${query}*)(mail=*${query}*)(sAMAccountName=*${query}*)))`; Продуктивність: wildcard на початку фільтра (*${query}*) не використовує індекс AD, пошук повільний при великій базі. Для застосунків з тисячами співробітників — синхронізуємо AD в Elasticsearch або PostgreSQL full-text search, пошук робимо там.
Синхронізація та кеш
AD — джерело правди для даних про співробітників. Мобільний застосунок працює з кешем backend. Для актуальності: webhook-події через AD Event Log (якщо AD 2016+) або polling раз на 15-30 хвилин на зміни через атрибут uSNChanged.
При звільненні співробітника акаунт в AD деактивується. Backend при наступному refresh_token бачить failed LDAP lookup та інвалідує JWT. Мобільний перенаправляється на логін.
Особливості Azure AD (Entra ID)
Якщо компанія використовує Azure AD (Microsoft Entra ID) — прямого LDAP немає, тільки Microsoft Graph API або OIDC. Graph API значно зручніший: REST, JSON, багата документація. GET /users/{id}?$select=displayName,mail,department,manager,memberOf повертає все те ж, що й LDAP, але без ADO-бібліотек.
Для гібридного середовища (on-premise AD + Azure AD з Azure AD Connect) — дані синхронізуються, можна використовувати або Graph API, або on-premise LDAP залежно від вимог безпеки.
Що входить в роботу
- Аудит поточної інфраструктури AD/LDAP та мобільного застосунку
- Проєктування архітектури backend-проксі
- Реалізація аутентифікації через LDAP-bind з JWT
- Створення API для отримання атрибутів, оргструктури, пошуку
- Налаштування кешування та синхронізації
- Інтеграція з Azure Graph API (при необхідності)
- Документація та навчання команди замовника
- Технічна підтримка на етапі експлуатації
Орієнтовні терміни та вартість
Інтеграція AD/LDAP (backend-проксі + мобільний клієнт + оргструктура + пошук): 3–6 тижнів. Вартість визначається після аудиту. Для точної оцінки зв'яжіться з нами для аудиту.
Наша команда виконала понад 40 проєктів з інтеграції AD/LDAP для банків, рітейлу та промисловості. Гарантуємо сумісність з будь-якими LDAP-серверами (OpenLDAP, FreeIPA, Active Directory). Зв'яжіться з нами для аудиту та отримайте індивідуальну комерційну пропозицію.







