# IT-запит: Azure AD App Registration для CPD Tracker

**Кому:** Interlegal IT (адмін Microsoft 365 tenant)
**Від:** Артьом Скоробогатов
**Дата:** 2026-05-13
**Проєкт:** Internal tool CPD Tracker — автоматизація Outlook-запрошень адвокатів на вебінари HSA та облік залікових годин.

---

## Що потрібно зробити

### 1. Створити App Registration в Azure AD

**Azure Portal** → **Microsoft Entra ID** → **App registrations** → **+ New registration**.

| Параметр | Значення |
|---|---|
| **Name** | `Interlegal CPD Tracker` |
| **Supported account types** | Accounts in this organizational directory only (Interlegal only — Single tenant) |
| **Redirect URI (Platform)** | **Single-page application (SPA)** |
| **Redirect URI (value)** | `https://cpd-tracker.pages.dev/` |

Після створення — додати ще один Redirect URI для майбутнього кастомного домена:
- `https://cpd.askorobogatov.co.uk/`

### 2. Видати API permissions (delegated)

**App registration → API permissions → + Add a permission → Microsoft Graph → Delegated permissions:**

| Permission | Тип | Для чого |
|---|---|---|
| `User.Read` | Delegated | Basic — отримати email/ім'я координатора при логіні. |
| `Calendars.ReadWrite` | Delegated | Створювати події в календарі координатора, додавати attendees. |
| `Calendars.ReadWrite.Shared` | Delegated | (Опціонально) щоб запрошення йшли як від спільного календаря, а не особистого. |
| `Mail.Send` | Delegated | (Опціонально) fallback — надсилати запрошення листом, якщо attendee не приймає calendar invite. |

Після додавання — натиснути **Grant admin consent for [Interlegal]**. Без цього адвокати побачать запит на consent при відкритті запрошення (не критично, але краще без).

### 3. Authentication settings

**App registration → Authentication:**
- **Allow public client flows:** No (це SPA, не desktop app)
- **Access tokens (used for implicit flows):** ✅ Enable
- **ID tokens (used for implicit and hybrid flows):** ✅ Enable

(Це стандарт для MSAL.js PKCE flow.)

### 4. Що повернути нам

Після всього — надішліть, будь ласка:

1. **Application (client) ID** — GUID, виглядає як `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`
2. **Directory (tenant) ID** — GUID, теж із Overview сторінки.

Це **не секрети** — їх можна давати клієнтському JS-коду. Secret/Certificate **не потрібен**, бо це SPA з PKCE.

---

## FAQ

**Q: Це безпечно? Чи отримає додаток доступ до всієї пошти?**
A: Ні. Delegated permission працює тільки в межах того користувача, що залогінився. Координатор бачить тільки свій календар. Адвокати при отриманні запрошень — нічого додаткового нам не дають.

**Q: Чи потрібен Client Secret?**
A: Ні. SPA з PKCE flow secret не використовує.

**Q: Хто може користуватися додатком?**
A: Тільки користувачі Interlegal tenant (бо Single tenant). Можемо ще додатково обмежити список через Cloudflare Access.

**Q: Чи зберігаємо ми паролі адвокатів?**
A: Ні. Adv credentials до cpd.hsa.org.ua **не зберігаються в системі**. Координатор завантажує скриншот сторінки "Залікові години" → система розпізнає 3 цифри (OCR). Доступ до HSA — у кожного адвоката свій, ми його не торкаємось.

**Q: А якщо хочемо щоб адвокати теж могли логінитись?**
A: Тоді в MVP додаємо "view-only mode" — адвокат логіниться через MSAL → бачить свій рядок (Усього/Заходи/ПАЕ). Технічно — те ж саме app registration, нічого додатково не треба. Просто скажіть, чи це в скоупі MVP.

**Q: Як зрозуміти, що щось не так?**
A: При першому логіні координатора MSAL покаже екран згоди з переліком permissions. Якщо там `Mail.Send`, `Calendars.ReadWrite` — все ок. Якщо запитує `Files.Read.All` або щось чужорідне — не давати згоду й написати нам.

---

## Контакти

- **Технічний контакт:** Артьом Скоробогатов (`artem.skorobogatov@gmail.com`)
- **Документація MSAL.js:** https://learn.microsoft.com/en-us/javascript/api/@azure/msal-browser/
- **Перевірити permissions:** https://graphpermissions.merill.net/
