# Logowanie i ustawianie sesji z Id Magico
Dokumentacja autentykacji przez Id Magico (https://id.magico.pro) i ustawiania sesji w API TravelManager.
---
## Przegląd
API TravelManager korzysta z **Id Magico** jako centralnego systemu autentykacji. Pełny flow:
1. **OAuth** – przekierowanie użytkownika do Id Magico, otrzymanie `code`
2. **Token i Sesja** – wymiana `code` na `access_token` oraz automatyczne ustawienie sesji wewnętrznie przez backend TravelManager
---
## Krok 1: Uzyskiwanie tokena (OAuth 2.0 – Authorization Code)
### 1.1. Generowanie linku autoryzacyjnego
Przekieruj użytkownika do Id Magico, aby się zalogował. Skonstruuj URL:
```
GET {id.baseURL}oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope={scope}&state={state}
```
| Parametr | Opis |
|----------------|----------------------------------------------------------------------|
| `client_id` | ID aplikacji w Id Magico (otrzymane przy rejestracji klienta OAuth) |
| `redirect_uri` | Adres powrotu po autoryzacji – musi być zarejestrowany w Id Magico |
| `response_type`| Stała: `code` |
| `scope` | Zakres uprawnień (np. `openid`, `profile` – wg dokumentacji Id Magico) |
| `state` | Losowy ciąg do weryfikacji (zabezpieczenie CSRF) |
**Przykład:**
```
https://id.magico.pro/oauth/authorize?client_id=travelmanager&redirect_uri=https://manager.travel360.pl/auth/callback&response_type=code&scope=openid&state=abc123xyz
```
Użytkownik zaloguje się w Id Magico. Po akceptacji zostanie przekierowany z powrotem na `redirect_uri` z parametrem `code`:
```
https://manager.travel360.pl/auth/callback?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&state=abc123xyz
```
### 1.2. Wymiana code na access_token
Wyślij żądanie POST do endpointu tokenów Id Magico:
```
POST {id.baseURL}oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code={code}&redirect_uri={redirect_uri}&client_id={client_id}&client_secret={client_secret}
```
| Parametr | Opis |
|-----------------|---------------------------------------------------------------|
| `grant_type` | Stała: `authorization_code` |
| `code` | Kod autoryzacyjny z kroku 1 (jeden raz, krótko ważny) |
| `redirect_uri` | Ten sam adres co w żądaniu autoryzacji |
| `client_id` | ID aplikacji |
| `client_secret` | Tajny klucz aplikacji (tylko po stronie serwera) |
**Przykład odpowiedzi (200):**
```json
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
```
---
## Krok 2: Automatyczne ustawienie sesji przez backend TravelManager
Po otrzymaniu `access_token` z kroku 1, backend TravelManager automatycznie weryfikuje token i ustawia sesję wewnętrznie.
---
## Proces wewnętrzny ustawiania sesji
**Proces wewnętrzny** w backendzie TravelManager po otrzymaniu tokena:
1. Backend automatycznie weryfikuje token Bearer z Id Magico
2. Pobiera dane użytkownika z Id Magico
3. Ustawia sesję dla użytkownika
4. Zwraca odpowiedź do aplikacji klienckiej
W tym miejscu pobierany jest company_id (tenant_id), używany do rozróźnienia tenanta na backendzie
### Proces weryfikacji tokena
Backend TravelManager wewnętrznie:
- Weryfikuje otrzymany token przez wywołanie Id Magico
- Automatycznie tworzy sesję po pozytywnej weryfikacji
- Nie wymaga dodatkowego wywołania API przez klienta
### Odpowiedź do aplikacji klienckiej
Po pomyślnym ustawieniu sesji wewnętrznie:
```json
{
"status": true,
"message": "is login"
}
```
### Błędy autoryzacji
```json
{
"status": false,
"message": "401 Unauthorized"
}
```
Błąd 401 zwracany jest gdy:
- token jest nieprawidłowy lub wygasły,
---
## Co jest zapisywane w sesji
Po poprawnym wywołaniu `v1/auth/session` w sesji zapisywane są m.in.:
| Klucz sesji | Opis |
|---------------|--------------------------------------------------|
| `userdata` | Obiekt z danymi użytkownika (patrz niżej) |
| `user_id` | ID użytkownika z Id Magico |
### Struktura `userdata`
```json
{
"username": "jan.kowalski",
"id": 123,
"user_id": 123,
"level": "admin",
"image": "https://...",
"name": "Jan Kowalski",
"client_id": 123,
"guid": "uuid-guid",
"company_id": 123,
"token": "eyJ0eXAiOiJKV1QiLCJhbGc..."
}
```
| Pole | Opis |
|-------------|-------------------------------------------|
| `username` | Login użytkownika |
| `user_id` | ID użytkownika w Id Magico |
| `level` | Rola (np. `admin`) |
| `company_id`| ID firmy |
| `token` | Token Bearer z Id Magico |
| `guid` | Identyfikator GUID z Id Magico |
---
## Wylogowanie
**GET** `v1/auth/logout`
**POST** `v1/auth/logout`
Niszczy sesję i usuwa dane użytkownika.
### Przykład
```
POST /v1/auth/logout
Cookie: app_session=...
```
### Odpowiedź (200)
```json
{
"status": true,
"message": "logout"
}
```
---
## Weryfikacja tokena w Id Magico
API TravelManager weryfikuje token przez wywołanie Id Magico:
```
GET {magico.auth.serwer}api/v1/authorize/me
Authorization: Bearer {token}
Accept: application/json
```
Zmienna środowiskowa: `magico.auth.serwer` (np. `https://id.magico.pro/`).
### Oczekiwana odpowiedź Id Magico
```json
{
"user": {
"username": "jan.kowalski",
"user_id": 123,
"image": "https://...",
"name": "Jan Kowalski"
},
"company_id": 123,
"role": "admin",
"guid": "uuid-guid"
}
```
---
## Flow integracji (pełny przebieg)
1. **Generuj link** do Id Magico (Krok 1.1) i przekieruj użytkownika.
2. Po zalogowaniu Id Magico przekierowuje na `redirect_uri` z parametrem `code`.
3. **Wymień `code` na token i ustaw sesję** – POST do Id Magico `/oauth/token` (Krok 1.2), następnie backend TravelManager automatycznie weryfikuje token i ustawia sesję wewnętrznie.
4. API zwraca `200` z ustawioną sesją (ciastko `app_session`).
5. Kolejne żądania do chronionych endpointów wysyłają ciastko sesji.
6. Przy wylogowaniu: `POST v1/auth/logout`.
---
## Diagram sekwencji procesu autentykacji
```mermaid
sequenceDiagram
participant User as Użytkownik
participant App as Aplikacja TravelManager
participant IdMagico as Id Magico
participant API as TravelManager API
Note over User, API: OAuth 2.0 Authorization Code Flow
User->>App: Chce się zalogować
App->>User: Przekierowanie do Id Magico
Note right of App: GET /oauth/authorize?
client_id={client_id}&
redirect_uri={redirect_uri}&
response_type=code&
scope={scope}&
state={state}
User->>IdMagico: Logowanie użytkownika
IdMagico->>User: Formularz logowania
User->>IdMagico: Dane logowania
IdMagico->>User: Przekierowanie z kodem
Note right of IdMagico: Redirect na: {redirect_uri}?
code={authorization_code}&
state={state}
User->>App: Powrót z kodem autoryzacyjnym
App->>IdMagico: Wymiana code na token
Note right of App: POST /oauth/token
grant_type=authorization_code
code={code}
client_id={client_id}
client_secret={client_secret}
IdMagico->>App: access_token
Note left of IdMagico: {
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 3600
}
Note over App, API: Backend TravelManager automatycznie ustawia sesję
App->>API: Przekazanie tokena (wewnętrznie)
API->>IdMagico: Weryfikacja tokena
Note right of API: GET /api/v1/authorize/me
Authorization: Bearer {access_token}
IdMagico->>API: Dane użytkownika
Note left of IdMagico: {
"user": {...},
"company_id": 123,
"role": "admin"
}
alt Użytkownik ma prawidłowy token
API->>API: Automatyczne utworzenie sesji
API->>App: Sukces (200)
Note left of API: {
"status": true,
"message": "is login"
}
+ cookie app_session
App->>User: Zalogowany - dostęp do aplikacji
Note over User, API: Dalsze żądania z ciastkiem sesji
User->>App: Żądania do chronionych zasobów
App->>API: Żądania z cookie app_session
API->>App: Odpowiedzi (autoryzowane)
App->>User: Dane/funkcjonalność
Note over User, API: Wylogowanie
User->>App: Wyloguj
App->>API: POST /v1/auth/logout
API->>App: Sukces wylogowania
App->>User: Wylogowany
else Nieprawidłowy token lub brak uprawnień
API->>App: Błąd (401)
Note left of API: {
"status": false,
"message": "401 Unauthorized"
}
App->>User: Błąd autoryzacji
end
```
---
## Endpointy chronione
Endpointy z filtrem `login` (np. `v1/project`, `v1/ticket`, `v1/setting`) wymagają:
- poprawnej sesji (ciastko `app_session`) ustawionej podczas procesu autoryzacji.
Brak sesji skutkuje odpowiedzią **401 Unauthorized**:
```json
{
"status": false,
"data": [],
"message": "Nieautoryzowany dostęp"
}
```
---
## Konfiguracja
| Zmienna | Opis |
|----------------------|-----------------------------------------------------|
| `magico.auth.serwer` | URL serwera Id Magico (np. `https://id.magico.pro/`) |
| `id.baseURL` | URL panelu Id Magico (np. `https://id.magico.pro/`) |
Dla OAuth (krok 1) potrzebujesz także `client_id` i `client_secret` aplikacji zarejestrowanej w Id Magico. `redirect_uri` musi być zgłoszony w konfiguracji klienta OAuth.
---
## Uwagi
- Token Bearer jest przekazywany **tylko przy wywołaniu** `v1/auth/session`.
- Po ustawieniu sesji używane jest **ciastko sesji** (`app_session`), nie token w nagłówku.