@ollaid/native-sso 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +232 -8
- package/dist/components/AppsLogoSlider.d.ts +2 -1
- package/dist/components/LoginModal.d.ts +3 -2
- package/dist/components/NativeSSOPage.d.ts +8 -3
- package/dist/components/PasswordRecoveryModal.d.ts +1 -2
- package/dist/components/SignupModal.d.ts +3 -2
- package/dist/hooks/useMobilePassword.d.ts +0 -1
- package/dist/hooks/useMobileRegistration.d.ts +0 -1
- package/dist/hooks/useNativeAuth.d.ts +73 -6
- package/dist/index.cjs +119 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +119 -48
- package/dist/index.js.map +1 -1
- package/dist/services/api.d.ts +9 -1
- package/dist/services/nativeAuth.d.ts +4 -0
- package/dist/types/native.d.ts +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,6 +60,7 @@ function App() {
|
|
|
60
60
|
<NativeSSOPage
|
|
61
61
|
saasApiUrl="https://mon-saas.com/api"
|
|
62
62
|
iamApiUrl="https://identityam.ollaid.com/api"
|
|
63
|
+
accountType="user"
|
|
63
64
|
onLoginSuccess={(token, user) => {
|
|
64
65
|
console.log('Connecté !', user.name);
|
|
65
66
|
navigate('/dashboard');
|
|
@@ -95,15 +96,220 @@ La page `/auth/sso` gère automatiquement :
|
|
|
95
96
|
|------|------|--------|-------------|
|
|
96
97
|
| `saasApiUrl` | `string` | ✅ | URL du backend SaaS (ex: `https://mon-saas.com/api`) |
|
|
97
98
|
| `iamApiUrl` | `string` | ✅ | URL du backend IAM (ex: `https://identityam.ollaid.com/api`) |
|
|
99
|
+
| `accountType` | `'user' \| 'client'` | ❌ | Type de compte à persister dans localStorage (défaut: `'user'`). Utile si vous avez plusieurs pages SSO avec des rôles différents. |
|
|
100
|
+
| `configPrefix` | `string` | ❌ | **Multi-tenant** : préfixe de configuration IAM côté backend (défaut: `'iam'`). Permet à un même backend SaaS de gérer N applications IAM. Voir [Multi-Tenant](#multi-tenant-plusieurs-applications-sur-le-même-backend). |
|
|
98
101
|
| `onLoginSuccess` | `(token: string, user: UserInfos) => void` | ❌ | Callback après connexion réussie |
|
|
99
102
|
| `onLogout` | `() => void` | ❌ | Callback après déconnexion |
|
|
100
|
-
| `debug` | `boolean` | ❌ | Active les logs console |
|
|
101
103
|
| `title` | `string` | ❌ | Titre personnalisé (défaut: "Un compte, plusieurs accès") |
|
|
102
104
|
| `description` | `string` | ❌ | Description personnalisée |
|
|
103
105
|
| `logoUrl` | `string` | ❌ | URL du logo (remplace le slider) |
|
|
104
106
|
| `hideFooter` | `boolean` | ❌ | Masquer "Propulsé par iam.ollaid.com" |
|
|
105
107
|
| `onOnboardingComplete` | `(data: { image_url?: string; ccphone?: string; phone?: string }) => void` | ❌ | Callback après complétion de l'onboarding |
|
|
106
108
|
|
|
109
|
+
> **Note :** Le mode `debug` est contrôlé **uniquement** par le backend via la variable d'environnement `IAM_DEBUG` dans le `.env` du SaaS. Il n'y a plus de prop `debug` à passer au composant. Le `DebugPanel` est **réactif** : il apparaît automatiquement après le chargement des credentials si `debug: true` est retourné par le backend.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Multi-Tenant (plusieurs applications sur le même backend)
|
|
114
|
+
|
|
115
|
+
Le package supporte N applications IAM sur le même backend SaaS via le prop `configPrefix`. C'est dynamique : vous pouvez ajouter autant d'applications que nécessaire sans modifier le code du package.
|
|
116
|
+
|
|
117
|
+
### Principe
|
|
118
|
+
|
|
119
|
+
Le frontend envoie un header `X-IAM-Config-Prefix` dans tous les appels au SaaS. Le backend utilise ce préfixe pour résoudre dynamiquement le bon bloc de configuration.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Frontend (configPrefix="iam_vendor")
|
|
123
|
+
→ GET /api/native/config [Header: X-IAM-Config-Prefix: iam_vendor]
|
|
124
|
+
|
|
125
|
+
Backend SaaS:
|
|
126
|
+
$prefix = $request->header('X-IAM-Config-Prefix', 'iam');
|
|
127
|
+
$appKey = config("services.{$prefix}.app_key"); // ← résolution dynamique
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Côté Frontend
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
{/* Page login principale */}
|
|
134
|
+
<NativeSSOPage
|
|
135
|
+
saasApiUrl="https://votre-saas.com/api"
|
|
136
|
+
iamApiUrl="https://identityam.ollaid.com/api"
|
|
137
|
+
configPrefix="iam"
|
|
138
|
+
accountType="user"
|
|
139
|
+
/>
|
|
140
|
+
|
|
141
|
+
{/* Page login espace vendeur */}
|
|
142
|
+
<NativeSSOPage
|
|
143
|
+
saasApiUrl="https://votre-saas.com/api"
|
|
144
|
+
iamApiUrl="https://identityam.ollaid.com/api"
|
|
145
|
+
configPrefix="iam_vendor"
|
|
146
|
+
accountType="client"
|
|
147
|
+
/>
|
|
148
|
+
|
|
149
|
+
{/* Page login admin — même backend, app IAM différente */}
|
|
150
|
+
<NativeSSOPage
|
|
151
|
+
saasApiUrl="https://votre-saas.com/api"
|
|
152
|
+
iamApiUrl="https://identityam.ollaid.com/api"
|
|
153
|
+
configPrefix="iam_admin"
|
|
154
|
+
accountType="user"
|
|
155
|
+
/>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Côté Backend SaaS — `.env`
|
|
159
|
+
|
|
160
|
+
Le préfixe `.env` correspond au `configPrefix` en UPPER_CASE. Ajoutez autant de blocs que nécessaire :
|
|
161
|
+
|
|
162
|
+
```env
|
|
163
|
+
# ===== Serveur IAM (partagé) =====
|
|
164
|
+
IAM_API_URL=https://identityam.ollaid.com/api
|
|
165
|
+
IAM_AUTH_URL=https://iam.ollaid.com
|
|
166
|
+
|
|
167
|
+
# ===== Préfixe "iam" (application principale) =====
|
|
168
|
+
IAM_APP_KEY=oiam_ak_xxx
|
|
169
|
+
IAM_PUBLIC_KEY=oiam_pk_xxx
|
|
170
|
+
IAM_SECRET_KEY=oiam_sk_xxx
|
|
171
|
+
IAM_WEBHOOK_SECRET=oiam_whsec_xxx
|
|
172
|
+
IAM_DEBUG=true
|
|
173
|
+
|
|
174
|
+
# ===== Préfixe "iam_vendor" (espace vendeur/shop) =====
|
|
175
|
+
IAM_VENDOR_APP_KEY=oiam_ak_yyy
|
|
176
|
+
IAM_VENDOR_PUBLIC_KEY=oiam_pk_yyy
|
|
177
|
+
IAM_VENDOR_SECRET_KEY=oiam_sk_yyy
|
|
178
|
+
IAM_VENDOR_WEBHOOK_SECRET=oiam_whsec_yyy
|
|
179
|
+
IAM_VENDOR_DEBUG=false
|
|
180
|
+
|
|
181
|
+
# ===== Préfixe "iam_client" (espace client) =====
|
|
182
|
+
IAM_CLIENT_APP_KEY=oiam_ak_zzz
|
|
183
|
+
IAM_CLIENT_SECRET_KEY=oiam_sk_zzz
|
|
184
|
+
IAM_CLIENT_DEBUG=true
|
|
185
|
+
|
|
186
|
+
# ===== Préfixe "iam_admin" (back-office) =====
|
|
187
|
+
IAM_ADMIN_APP_KEY=oiam_ak_aaa
|
|
188
|
+
IAM_ADMIN_SECRET_KEY=oiam_sk_aaa
|
|
189
|
+
IAM_ADMIN_DEBUG=true
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Côté Backend SaaS — `config/services.php`
|
|
193
|
+
|
|
194
|
+
```php
|
|
195
|
+
return [
|
|
196
|
+
'iam' => [
|
|
197
|
+
'api_url' => env('IAM_API_URL', 'https://identityam.ollaid.com/api'),
|
|
198
|
+
'app_key' => env('IAM_APP_KEY'),
|
|
199
|
+
'public_key' => env('IAM_PUBLIC_KEY'),
|
|
200
|
+
'secret_key' => env('IAM_SECRET_KEY'),
|
|
201
|
+
'debug' => env('IAM_DEBUG', false),
|
|
202
|
+
],
|
|
203
|
+
'iam_vendor' => [
|
|
204
|
+
'api_url' => env('IAM_API_URL'),
|
|
205
|
+
'app_key' => env('IAM_VENDOR_APP_KEY'),
|
|
206
|
+
'public_key' => env('IAM_VENDOR_PUBLIC_KEY'),
|
|
207
|
+
'secret_key' => env('IAM_VENDOR_SECRET_KEY'),
|
|
208
|
+
'debug' => env('IAM_VENDOR_DEBUG', false),
|
|
209
|
+
],
|
|
210
|
+
'iam_client' => [
|
|
211
|
+
'api_url' => env('IAM_API_URL'),
|
|
212
|
+
'app_key' => env('IAM_CLIENT_APP_KEY'),
|
|
213
|
+
'secret_key' => env('IAM_CLIENT_SECRET_KEY'),
|
|
214
|
+
'debug' => env('IAM_CLIENT_DEBUG', false),
|
|
215
|
+
],
|
|
216
|
+
'iam_admin' => [
|
|
217
|
+
'api_url' => env('IAM_API_URL'),
|
|
218
|
+
'app_key' => env('IAM_ADMIN_APP_KEY'),
|
|
219
|
+
'secret_key' => env('IAM_ADMIN_SECRET_KEY'),
|
|
220
|
+
'debug' => env('IAM_ADMIN_DEBUG', false),
|
|
221
|
+
],
|
|
222
|
+
// Ajoutez d'autres blocs selon vos besoins...
|
|
223
|
+
];
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Côté Backend SaaS — Controller multi-tenant
|
|
227
|
+
|
|
228
|
+
Tous les controllers Native (`config`, `exchange`, `check-token`, `logout`) doivent lire le header :
|
|
229
|
+
|
|
230
|
+
```php
|
|
231
|
+
class NativeConfigController extends Controller
|
|
232
|
+
{
|
|
233
|
+
public function getConfig(Request $request): JsonResponse
|
|
234
|
+
{
|
|
235
|
+
// Multi-tenant : résolution dynamique du préfixe
|
|
236
|
+
$prefix = $request->header('X-IAM-Config-Prefix', 'iam');
|
|
237
|
+
|
|
238
|
+
// Sécurité : valider que le préfixe commence par "iam"
|
|
239
|
+
if (!str_starts_with($prefix, 'iam')) {
|
|
240
|
+
return response()->json(['success' => false, 'message' => 'Invalid config prefix'], 400);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
$appKey = config("services.{$prefix}.app_key");
|
|
244
|
+
$secretKey = config("services.{$prefix}.secret_key");
|
|
245
|
+
$debug = (bool) config("services.{$prefix}.debug", false);
|
|
246
|
+
|
|
247
|
+
if (!$appKey || !$secretKey) {
|
|
248
|
+
return response()->json([
|
|
249
|
+
'success' => false,
|
|
250
|
+
'message' => "Configuration '{$prefix}' non trouvée",
|
|
251
|
+
], 404);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Chiffrement Opaque Token (AES-256-CBC)
|
|
255
|
+
$payload = json_encode(['secret_key' => $secretKey, 'ts' => time()]);
|
|
256
|
+
$key = hash('sha256', $secretKey, true);
|
|
257
|
+
$iv = random_bytes(16);
|
|
258
|
+
$encrypted = openssl_encrypt($payload, 'AES-256-CBC', $key, 0, $iv);
|
|
259
|
+
$encryptedCredentials = base64_encode($iv . '::' . $encrypted);
|
|
260
|
+
|
|
261
|
+
return response()->json([
|
|
262
|
+
'success' => true,
|
|
263
|
+
'app_key' => $appKey,
|
|
264
|
+
'encrypted_credentials' => $encryptedCredentials,
|
|
265
|
+
'credentials_ttl' => 300,
|
|
266
|
+
'debug' => $debug,
|
|
267
|
+
]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
> **⚠️ Important** : Appliquez la même logique `X-IAM-Config-Prefix` dans `exchange`, `check-token` et `logout`.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Debug Mode — Troubleshooting
|
|
277
|
+
|
|
278
|
+
Le debug est **piloté par le backend** : le package n'a aucun prop `debug`.
|
|
279
|
+
|
|
280
|
+
### Comment ça marche
|
|
281
|
+
|
|
282
|
+
1. Le backend lit `IAM_DEBUG` (ou `IAM_VENDOR_DEBUG`, etc.) depuis `.env`
|
|
283
|
+
2. `GET /api/native/config` retourne `"debug": true`
|
|
284
|
+
3. Le package active les logs console + le `DebugPanel`
|
|
285
|
+
4. Le `DebugPanel` est **réactif** : il apparaît automatiquement après le chargement des credentials
|
|
286
|
+
|
|
287
|
+
### Checklist de troubleshooting
|
|
288
|
+
|
|
289
|
+
| Problème | Solution |
|
|
290
|
+
|----------|----------|
|
|
291
|
+
| `DebugPanel` n'apparaît pas | Vérifier que `GET /api/native/config` retourne `"debug": true` dans la réponse JSON |
|
|
292
|
+
| La valeur est toujours `false` | Vérifier le `.env` : pas de typo ! (`IAM_DEBUG` et non `IAM_DEBUGL`) |
|
|
293
|
+
| Changement non pris en compte | Lancer `php artisan config:clear && php artisan config:cache` |
|
|
294
|
+
| Debug actif en production | Mettre `IAM_DEBUG=false` dans le `.env` de production |
|
|
295
|
+
| Debug marche pour main mais pas vendor | Vérifier `IAM_VENDOR_DEBUG=true` dans `.env` + `config/services.php` |
|
|
296
|
+
|
|
297
|
+
### ⚠️ Erreur fréquente : typo dans `.env`
|
|
298
|
+
|
|
299
|
+
```env
|
|
300
|
+
# ❌ MAUVAIS (typo "DEBUGL" avec un L en trop)
|
|
301
|
+
IAM_DEBUGL=true
|
|
302
|
+
|
|
303
|
+
# ✅ CORRECT
|
|
304
|
+
IAM_DEBUG=true
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Après correction, n'oubliez pas :
|
|
308
|
+
```bash
|
|
309
|
+
php artisan config:clear
|
|
310
|
+
php artisan config:cache
|
|
311
|
+
```
|
|
312
|
+
|
|
107
313
|
---
|
|
108
314
|
|
|
109
315
|
## Usage avancé (composants individuels)
|
|
@@ -227,6 +433,11 @@ $secretKey = $payload['secret_key'];
|
|
|
227
433
|
|
|
228
434
|
### `POST /api/native/exchange`
|
|
229
435
|
|
|
436
|
+
> ⚠️ **IMPORTANT — Route PUBLIQUE obligatoire**
|
|
437
|
+
> Cette route **NE DOIT PAS** être derrière le middleware `auth:sanctum`.
|
|
438
|
+
> Si vous la placez dans un groupe `Route::middleware('auth:sanctum')`, le frontend recevra une **erreur 401 Unauthenticated** systématique car l'utilisateur n'a pas encore de token Sanctum à ce stade du flux.
|
|
439
|
+
> Assurez-vous que `/api/native/config` et `/api/native/exchange` sont **en dehors** de tout groupe authentifié.
|
|
440
|
+
|
|
230
441
|
Échange le `callback_token` reçu de l'IAM contre un token Sanctum local.
|
|
231
442
|
|
|
232
443
|
**Headers requis :** `Content-Type: application/json`
|
|
@@ -665,14 +876,19 @@ class NativeAuthController extends Controller
|
|
|
665
876
|
|
|
666
877
|
### Routes `routes/api.php`
|
|
667
878
|
|
|
879
|
+
> ⚠️ **Attention au placement des routes !**
|
|
880
|
+
> `config` et `exchange` doivent être **publiques** (pas de middleware auth).
|
|
881
|
+
> `check-token` et `logout` doivent être **protégées** par `auth:sanctum`.
|
|
882
|
+
> Si `exchange` est derrière `auth:sanctum`, le frontend recevra un **401 Unauthenticated**.
|
|
883
|
+
|
|
668
884
|
```php
|
|
669
885
|
use App\Http\Controllers\Api\NativeAuthController;
|
|
670
886
|
|
|
671
|
-
// Routes
|
|
887
|
+
// ✅ Routes PUBLIQUES (pas d'auth requise — l'utilisateur n'a pas encore de token)
|
|
672
888
|
Route::get('/native/config', [NativeAuthController::class, 'config']);
|
|
673
889
|
Route::post('/native/exchange', [NativeAuthController::class, 'exchange']);
|
|
674
890
|
|
|
675
|
-
// Routes
|
|
891
|
+
// 🔒 Routes PROTÉGÉES (auth Sanctum requise — l'utilisateur a un token)
|
|
676
892
|
Route::middleware('auth:sanctum')->group(function () {
|
|
677
893
|
Route::post('/native/check-token', [NativeAuthController::class, 'checkToken']);
|
|
678
894
|
Route::post('/native/logout', [NativeAuthController::class, 'logout']);
|
|
@@ -1370,20 +1586,27 @@ Toutes les APIs IAM retournent le même objet `user_infos` avec exactement **9 c
|
|
|
1370
1586
|
|
|
1371
1587
|
## Session & localStorage
|
|
1372
1588
|
|
|
1373
|
-
Le package utilise **
|
|
1589
|
+
Le package utilise **5 clés** dans `localStorage` pour persister la session :
|
|
1374
1590
|
|
|
1375
1591
|
| Clé | Contenu | Source | Valeurs possibles |
|
|
1376
1592
|
|-----|---------|--------|-------------------|
|
|
1377
1593
|
| `token` | Token Sanctum (bearer) | Réponse de `/api/native/exchange` | Chaîne `"1\|abc123..."` |
|
|
1378
1594
|
| `auth_token` | Copie du token (compatibilité) | Même source que `token` | Idem |
|
|
1379
|
-
| `user` | Objet
|
|
1595
|
+
| `user` | Objet utilisateur enrichi sérialisé en JSON | Réponse de `/api/native/exchange` ou mise à jour via health check | `{"iam_reference":"USR-XXX","alias_reference":"ALI-XXX","name":"...","email":"...",...}` |
|
|
1380
1596
|
| `account_type` | Type de compte | Déterminé lors du `exchange` selon le mode d'inscription | `"user"` (défaut) ou `"client"` (inscription phone-only) |
|
|
1597
|
+
| `alias_reference` | Référence alias utilisée lors de la connexion | Réponse de `/api/native/exchange` (champ `user.alias_reference`) | `"ALI-XXXXXXXX"` |
|
|
1598
|
+
|
|
1599
|
+
> **Note :** `account_type` et `alias_reference` sont stockés **séparément** de l'objet `user` en plus d'être inclus dans le JSON de la clé `user`.
|
|
1600
|
+
|
|
1601
|
+
#### Champs enrichis dans l'objet `user`
|
|
1381
1602
|
|
|
1382
|
-
|
|
1603
|
+
L'objet `user` stocké en localStorage contient deux champs ajoutés automatiquement par le package :
|
|
1604
|
+
- `iam_reference` : la référence IAM de l'utilisateur (`USR-XXXXXXXX`), extraite de `user.reference`
|
|
1605
|
+
- `alias_reference` : la référence de l'alias utilisé lors de la connexion (`ALI-XXXXXXXX`), extraite de `user.alias_reference`
|
|
1383
1606
|
|
|
1384
1607
|
### Nettoyage
|
|
1385
1608
|
|
|
1386
|
-
Lors du `logout()`, les
|
|
1609
|
+
Lors du `logout()`, les 5 clés sont supprimées via `clearAuthToken()`.
|
|
1387
1610
|
|
|
1388
1611
|
### Accès programmatique
|
|
1389
1612
|
|
|
@@ -1391,8 +1614,9 @@ Lors du `logout()`, les 4 clés sont supprimées via `clearAuthToken()`.
|
|
|
1391
1614
|
import { getAuthToken, getAuthUser, getAccountType } from '@ollaid/native-sso';
|
|
1392
1615
|
|
|
1393
1616
|
const token = getAuthToken(); // string | null
|
|
1394
|
-
const user = getAuthUser<UserInfos>(); // UserInfos | null
|
|
1617
|
+
const user = getAuthUser<UserInfos>(); // UserInfos | null — contient iam_reference et alias_reference
|
|
1395
1618
|
const type = getAccountType(); // string | null
|
|
1619
|
+
const aliasRef = localStorage.getItem('alias_reference'); // string | null
|
|
1396
1620
|
```
|
|
1397
1621
|
|
|
1398
1622
|
---
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
interface AppsLogoSliderProps {
|
|
5
5
|
speed?: 'slow' | 'normal' | 'fast';
|
|
6
6
|
className?: string;
|
|
7
|
+
iamApiUrl?: string;
|
|
7
8
|
}
|
|
8
|
-
export declare function AppsLogoSlider({ speed, className }: AppsLogoSliderProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
|
+
export declare function AppsLogoSlider({ speed, className, iamApiUrl: iamApiUrlProp }: AppsLogoSliderProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
10
|
export default AppsLogoSlider;
|
|
@@ -14,7 +14,8 @@ export interface LoginModalProps {
|
|
|
14
14
|
iamApiUrl: string;
|
|
15
15
|
loading?: boolean;
|
|
16
16
|
showSwitchToSignup?: boolean;
|
|
17
|
-
|
|
17
|
+
/** Type de compte par défaut à persister dans localStorage */
|
|
18
|
+
defaultAccountType?: 'user' | 'client';
|
|
18
19
|
}
|
|
19
|
-
export declare function LoginModal({ open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup,
|
|
20
|
+
export declare function LoginModal({ open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup, defaultAccountType, }: LoginModalProps): import("react/jsx-runtime").JSX.Element;
|
|
20
21
|
export default LoginModal;
|
|
@@ -20,8 +20,13 @@ export interface NativeSSOPageProps {
|
|
|
20
20
|
ccphone?: string;
|
|
21
21
|
phone?: string;
|
|
22
22
|
}) => void;
|
|
23
|
-
/**
|
|
24
|
-
|
|
23
|
+
/** Type de compte à persister dans localStorage (défaut: 'user') */
|
|
24
|
+
accountType?: 'user' | 'client';
|
|
25
|
+
/**
|
|
26
|
+
* Préfixe de configuration IAM côté backend (défaut: 'iam').
|
|
27
|
+
* Permet le multi-tenant : 'iam', 'iam_vendor', 'iam_client', 'iam_admin', etc.
|
|
28
|
+
*/
|
|
29
|
+
configPrefix?: string;
|
|
25
30
|
/** Titre personnalisé */
|
|
26
31
|
title?: string;
|
|
27
32
|
/** Description personnalisée */
|
|
@@ -31,5 +36,5 @@ export interface NativeSSOPageProps {
|
|
|
31
36
|
/** Masquer le footer "Propulsé par" */
|
|
32
37
|
hideFooter?: boolean;
|
|
33
38
|
}
|
|
34
|
-
export declare function NativeSSOPage({ saasApiUrl, iamApiUrl, onLoginSuccess, onLogout, onOnboardingComplete,
|
|
39
|
+
export declare function NativeSSOPage({ saasApiUrl, iamApiUrl, onLoginSuccess, onLogout, onOnboardingComplete, accountType, configPrefix, title, description, logoUrl, hideFooter, }: NativeSSOPageProps): import("react/jsx-runtime").JSX.Element;
|
|
35
40
|
export default NativeSSOPage;
|
|
@@ -11,7 +11,6 @@ export interface PasswordRecoveryModalProps {
|
|
|
11
11
|
onSuccess: () => void;
|
|
12
12
|
saasApiUrl: string;
|
|
13
13
|
iamApiUrl: string;
|
|
14
|
-
debug?: boolean;
|
|
15
14
|
}
|
|
16
|
-
export declare function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl
|
|
15
|
+
export declare function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps): import("react/jsx-runtime").JSX.Element;
|
|
17
16
|
export default PasswordRecoveryModal;
|
|
@@ -12,7 +12,8 @@ export interface SignupModalProps {
|
|
|
12
12
|
onSignupSuccess: (token: string, user: UserInfos) => void;
|
|
13
13
|
saasApiUrl: string;
|
|
14
14
|
iamApiUrl: string;
|
|
15
|
-
|
|
15
|
+
/** Type de compte par défaut à persister dans localStorage */
|
|
16
|
+
defaultAccountType?: 'user' | 'client';
|
|
16
17
|
}
|
|
17
|
-
export declare function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl,
|
|
18
|
+
export declare function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, defaultAccountType }: SignupModalProps): import("react/jsx-runtime").JSX.Element;
|
|
18
19
|
export default SignupModal;
|
|
@@ -19,7 +19,6 @@ interface RegistrationConflict {
|
|
|
19
19
|
export interface UseMobileRegistrationOptions {
|
|
20
20
|
saasApiUrl: string;
|
|
21
21
|
iamApiUrl: string;
|
|
22
|
-
debug?: boolean;
|
|
23
22
|
}
|
|
24
23
|
export declare function useMobileRegistration(options?: UseMobileRegistrationOptions): {
|
|
25
24
|
processToken: string | null;
|
|
@@ -12,8 +12,13 @@ export interface UseNativeAuthOptions {
|
|
|
12
12
|
iamApiUrl: string;
|
|
13
13
|
/** Charger les credentials automatiquement au montage */
|
|
14
14
|
autoLoadCredentials?: boolean;
|
|
15
|
-
/**
|
|
16
|
-
|
|
15
|
+
/** Type de compte par défaut à persister (défaut: 'user') */
|
|
16
|
+
defaultAccountType?: 'user' | 'client';
|
|
17
|
+
/**
|
|
18
|
+
* Préfixe de configuration IAM côté backend (défaut: 'iam').
|
|
19
|
+
* Permet le multi-tenant dynamique : 'iam', 'iam_vendor', 'iam_client', etc.
|
|
20
|
+
*/
|
|
21
|
+
configPrefix?: string;
|
|
17
22
|
}
|
|
18
23
|
export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
19
24
|
credentialsLoaded: boolean;
|
|
@@ -49,6 +54,8 @@ export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
|
49
54
|
error: string | null;
|
|
50
55
|
errorType: string | null;
|
|
51
56
|
isAuthenticated: boolean;
|
|
57
|
+
/** Debug réactif — mis à jour après loadCredentials */
|
|
58
|
+
isDebug: boolean;
|
|
52
59
|
accountType: AccountType;
|
|
53
60
|
isPhoneOnly: boolean;
|
|
54
61
|
otpMethod: "email" | "sms" | null | undefined;
|
|
@@ -117,7 +124,22 @@ export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
|
117
124
|
error_type?: undefined;
|
|
118
125
|
} | {
|
|
119
126
|
success: boolean;
|
|
120
|
-
user:
|
|
127
|
+
user: {
|
|
128
|
+
iam_reference: string;
|
|
129
|
+
alias_reference: any;
|
|
130
|
+
id?: number;
|
|
131
|
+
reference: string;
|
|
132
|
+
name: string;
|
|
133
|
+
email?: string | null;
|
|
134
|
+
phone?: string;
|
|
135
|
+
ccphone?: string;
|
|
136
|
+
image_url?: string;
|
|
137
|
+
account_type?: "user" | "client";
|
|
138
|
+
town?: string;
|
|
139
|
+
country?: string;
|
|
140
|
+
address?: string;
|
|
141
|
+
auth_2fa?: boolean;
|
|
142
|
+
};
|
|
121
143
|
callback_token: string;
|
|
122
144
|
error?: undefined;
|
|
123
145
|
requires_2fa?: undefined;
|
|
@@ -157,7 +179,22 @@ export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
|
157
179
|
error_type?: undefined;
|
|
158
180
|
} | {
|
|
159
181
|
success: boolean;
|
|
160
|
-
user:
|
|
182
|
+
user: {
|
|
183
|
+
iam_reference: string;
|
|
184
|
+
alias_reference: any;
|
|
185
|
+
id?: number;
|
|
186
|
+
reference: string;
|
|
187
|
+
name: string;
|
|
188
|
+
email?: string | null;
|
|
189
|
+
phone?: string;
|
|
190
|
+
ccphone?: string;
|
|
191
|
+
image_url?: string;
|
|
192
|
+
account_type?: "user" | "client";
|
|
193
|
+
town?: string;
|
|
194
|
+
country?: string;
|
|
195
|
+
address?: string;
|
|
196
|
+
auth_2fa?: boolean;
|
|
197
|
+
};
|
|
161
198
|
callback_token: string;
|
|
162
199
|
error?: undefined;
|
|
163
200
|
status?: undefined;
|
|
@@ -184,7 +221,22 @@ export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
|
184
221
|
error_type?: undefined;
|
|
185
222
|
} | {
|
|
186
223
|
success: boolean;
|
|
187
|
-
user:
|
|
224
|
+
user: {
|
|
225
|
+
iam_reference: string;
|
|
226
|
+
alias_reference: any;
|
|
227
|
+
id?: number;
|
|
228
|
+
reference: string;
|
|
229
|
+
name: string;
|
|
230
|
+
email?: string | null;
|
|
231
|
+
phone?: string;
|
|
232
|
+
ccphone?: string;
|
|
233
|
+
image_url?: string;
|
|
234
|
+
account_type?: "user" | "client";
|
|
235
|
+
town?: string;
|
|
236
|
+
country?: string;
|
|
237
|
+
address?: string;
|
|
238
|
+
auth_2fa?: boolean;
|
|
239
|
+
};
|
|
188
240
|
error?: undefined;
|
|
189
241
|
error_type?: undefined;
|
|
190
242
|
} | {
|
|
@@ -201,7 +253,22 @@ export declare function useNativeAuth(options: UseNativeAuthOptions): {
|
|
|
201
253
|
error_type?: undefined;
|
|
202
254
|
} | {
|
|
203
255
|
success: boolean;
|
|
204
|
-
user:
|
|
256
|
+
user: {
|
|
257
|
+
iam_reference: string;
|
|
258
|
+
alias_reference: any;
|
|
259
|
+
id?: number;
|
|
260
|
+
reference: string;
|
|
261
|
+
name: string;
|
|
262
|
+
email?: string | null;
|
|
263
|
+
phone?: string;
|
|
264
|
+
ccphone?: string;
|
|
265
|
+
image_url?: string;
|
|
266
|
+
account_type?: "user" | "client";
|
|
267
|
+
town?: string;
|
|
268
|
+
country?: string;
|
|
269
|
+
address?: string;
|
|
270
|
+
auth_2fa?: boolean;
|
|
271
|
+
};
|
|
205
272
|
callback_token: string;
|
|
206
273
|
error?: undefined;
|
|
207
274
|
error_type?: undefined;
|