@aurabase/auth 0.6.0 → 0.6.2
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 +1 -1
- package/dist/index.cjs +182 -37
- package/dist/index.d.cts +135 -3
- package/dist/index.d.ts +135 -3
- package/dist/index.js +182 -37
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -11,6 +11,9 @@ var AuthAdminService = class extends BaseService {
|
|
|
11
11
|
return "/v1/auth/admin";
|
|
12
12
|
}
|
|
13
13
|
// -- Users ----------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Liste les utilisateurs du projet, avec recherche (`search`) et pagination (`limit`, `offset`).
|
|
16
|
+
*/
|
|
14
17
|
async listUsers(params) {
|
|
15
18
|
const query = new URLSearchParams();
|
|
16
19
|
if (params?.limit !== void 0) query.set("limit", String(params.limit));
|
|
@@ -19,34 +22,52 @@ var AuthAdminService = class extends BaseService {
|
|
|
19
22
|
const qs = query.toString();
|
|
20
23
|
return this.request("GET", `${this.prefix}/users${qs ? "?" + qs : ""}`);
|
|
21
24
|
}
|
|
25
|
+
/** Lit un utilisateur par son identifiant. */
|
|
22
26
|
async getUser(userId) {
|
|
23
27
|
return this.request("GET", `${this.prefix}/users/${userId}`);
|
|
24
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Crée un utilisateur sans passer par l'inscription publique (e-mail, mot de passe, métadonnées, rôle).
|
|
31
|
+
*/
|
|
25
32
|
async createUser(data) {
|
|
26
33
|
return this.request("POST", `${this.prefix}/users`, data);
|
|
27
34
|
}
|
|
35
|
+
/** Met à jour un utilisateur : seuls les champs fournis changent. */
|
|
28
36
|
async updateUser(userId, data) {
|
|
29
37
|
return this.request("PUT", `${this.prefix}/users/${userId}`, data);
|
|
30
38
|
}
|
|
39
|
+
/** Supprime un utilisateur. */
|
|
31
40
|
async deleteUser(userId) {
|
|
32
41
|
return this.request("DELETE", `${this.prefix}/users/${userId}`);
|
|
33
42
|
}
|
|
43
|
+
/** Bannit un utilisateur : il ne peut plus se connecter. */
|
|
34
44
|
async banUser(userId) {
|
|
35
45
|
return this.request("POST", `${this.prefix}/users/${userId}/ban`, {});
|
|
36
46
|
}
|
|
47
|
+
/** Lève le bannissement d'un utilisateur. */
|
|
37
48
|
async unbanUser(userId) {
|
|
38
49
|
return this.request("POST", `${this.prefix}/users/${userId}/unban`, {});
|
|
39
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
53
|
+
*/
|
|
40
54
|
async generateLink(userId, type) {
|
|
41
55
|
return this.request("POST", `${this.prefix}/users/${userId}/generate-link`, { type });
|
|
42
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Statistiques des utilisateurs : total, vérifiés, bannis, avec MFA et nouveaux sur 7 jours.
|
|
59
|
+
*/
|
|
43
60
|
async getUserStats() {
|
|
44
61
|
return this.request("GET", `${this.prefix}/users/stats`);
|
|
45
62
|
}
|
|
63
|
+
/** Liste les identités liées à un utilisateur (fournisseurs OAuth, e-mail). */
|
|
46
64
|
async listUserIdentities(userId) {
|
|
47
65
|
return this.request("GET", `${this.prefix}/users/${userId}/identities`);
|
|
48
66
|
}
|
|
49
67
|
// -- Sessions ---------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Liste les sessions actives de tous les utilisateurs, filtrables par `userId`, avec pagination.
|
|
70
|
+
*/
|
|
50
71
|
async listSessions(params) {
|
|
51
72
|
const query = new URLSearchParams();
|
|
52
73
|
if (params?.userId !== void 0) query.set("user_id", params.userId);
|
|
@@ -55,10 +76,14 @@ var AuthAdminService = class extends BaseService {
|
|
|
55
76
|
const qs = query.toString();
|
|
56
77
|
return this.request("GET", `${this.prefix}/sessions${qs ? "?" + qs : ""}`);
|
|
57
78
|
}
|
|
79
|
+
/** Révoque une session par son identifiant. */
|
|
58
80
|
async revokeSession(sessionId) {
|
|
59
81
|
return this.request("DELETE", `${this.prefix}/sessions/${sessionId}`);
|
|
60
82
|
}
|
|
61
83
|
// -- Audit log ------------------------------------------------------------
|
|
84
|
+
/**
|
|
85
|
+
* Lit le journal d'audit (action, adresse IP, agent utilisateur, date), filtrable par `userId`, avec pagination.
|
|
86
|
+
*/
|
|
62
87
|
async getAuditLog(params) {
|
|
63
88
|
const query = new URLSearchParams();
|
|
64
89
|
if (params?.userId !== void 0) query.set("user_id", params.userId);
|
|
@@ -68,6 +93,9 @@ var AuthAdminService = class extends BaseService {
|
|
|
68
93
|
return this.request("GET", `${this.prefix}/audit-log${qs ? "?" + qs : ""}`);
|
|
69
94
|
}
|
|
70
95
|
// -- Settings -------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Lit les réglages d'authentification du projet. Les secrets (mot de passe SMTP, clés) ne sont jamais renvoyés.
|
|
98
|
+
*/
|
|
71
99
|
async getSettings() {
|
|
72
100
|
return this.request("GET", `${this.prefix}/settings`);
|
|
73
101
|
}
|
|
@@ -90,18 +118,23 @@ var AuthAdminService = class extends BaseService {
|
|
|
90
118
|
return this.request("PUT", `${this.prefix}/settings`, data);
|
|
91
119
|
}
|
|
92
120
|
// -- Email templates ------------------------------------------------------
|
|
121
|
+
/** Liste les modèles d'e-mail d'authentification du projet. */
|
|
93
122
|
async listEmailTemplates() {
|
|
94
123
|
return this.request("GET", `${this.prefix}/email-templates`);
|
|
95
124
|
}
|
|
125
|
+
/** Lit le modèle d'e-mail d'un type donné (par exemple confirmation, récupération). */
|
|
96
126
|
async getEmailTemplate(type) {
|
|
97
127
|
return this.request("GET", `${this.prefix}/email-templates/${type}`);
|
|
98
128
|
}
|
|
129
|
+
/** Remplace le contenu du modèle d'e-mail d'un type donné. */
|
|
99
130
|
async updateEmailTemplate(type, data) {
|
|
100
131
|
return this.request("PUT", `${this.prefix}/email-templates/${type}`, data);
|
|
101
132
|
}
|
|
133
|
+
/** Supprime le modèle personnalisé d'un type d'e-mail. */
|
|
102
134
|
async deleteEmailTemplate(type) {
|
|
103
135
|
return this.request("DELETE", `${this.prefix}/email-templates/${type}`);
|
|
104
136
|
}
|
|
137
|
+
/** Envoie un e-mail de test avec le modèle d'un type à l'adresse `to_email`. */
|
|
105
138
|
async testEmailTemplate(type, body) {
|
|
106
139
|
return this.request("POST", `${this.prefix}/email-templates/${type}/test`, body);
|
|
107
140
|
}
|
|
@@ -630,6 +663,10 @@ var AuthService = class extends BaseService {
|
|
|
630
663
|
return `aura-${clientScope(this.client.baseUrl)}-oauth-implicit-initiated`;
|
|
631
664
|
}
|
|
632
665
|
// -- Auth state change ------------------------------------------------------
|
|
666
|
+
/**
|
|
667
|
+
* Écoute les changements d'état de la session (`SIGNED_IN`, `SIGNED_OUT`, `TOKEN_REFRESHED`, `USER_UPDATED`,
|
|
668
|
+
* `MFA_CHALLENGE`…). Renvoie de quoi se désabonner : `unsubscribe()` ou `data.subscription.unsubscribe()`.
|
|
669
|
+
*/
|
|
633
670
|
onAuthStateChange(callback) {
|
|
634
671
|
const unsub = () => {
|
|
635
672
|
this._stateListeners.delete(callback);
|
|
@@ -679,8 +716,24 @@ var AuthService = class extends BaseService {
|
|
|
679
716
|
}
|
|
680
717
|
}
|
|
681
718
|
// -- Sign up / sign in / sign out -------------------------------------------
|
|
719
|
+
/**
|
|
720
|
+
* Crée un compte avec e-mail et mot de passe. Si le projet n'exige pas de confirmation et que le MFA n'est pas actif,
|
|
721
|
+
* la session est enregistrée et `SIGNED_IN` est émis ; sinon la réponse est un défi MFA (voir `isMfaChallenge`).
|
|
722
|
+
*/
|
|
682
723
|
async signUp(req) {
|
|
683
|
-
const
|
|
724
|
+
const payload = {
|
|
725
|
+
email: req.email,
|
|
726
|
+
password: req.password
|
|
727
|
+
};
|
|
728
|
+
if (req.captcha_token) payload.captcha_token = req.captcha_token;
|
|
729
|
+
if (req.name) {
|
|
730
|
+
payload.name = req.name;
|
|
731
|
+
} else if (req.options?.data && typeof req.options.data.name === "string") {
|
|
732
|
+
payload.name = req.options.data.name;
|
|
733
|
+
}
|
|
734
|
+
if (req.options?.data) payload.data = req.options.data;
|
|
735
|
+
if (req.options?.emailRedirectTo) payload.email_redirect_to = req.options.emailRedirectTo;
|
|
736
|
+
const res = await this.request("POST", `${this.prefix}/register`, payload);
|
|
684
737
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
685
738
|
const tp = res.data;
|
|
686
739
|
tp.accessToken = tp.access_token;
|
|
@@ -713,8 +766,18 @@ var AuthService = class extends BaseService {
|
|
|
713
766
|
}
|
|
714
767
|
return res;
|
|
715
768
|
}
|
|
769
|
+
/**
|
|
770
|
+
* Connecte un utilisateur par e-mail et mot de passe. Enregistre la session et émet `SIGNED_IN` ;
|
|
771
|
+
* si le MFA est actif, renvoie un défi (`isMfaChallenge`) à compléter par `mfaVerify`.
|
|
772
|
+
*/
|
|
716
773
|
async signInWithPassword(req) {
|
|
717
|
-
const
|
|
774
|
+
const payload = {
|
|
775
|
+
email: req.email,
|
|
776
|
+
password: req.password
|
|
777
|
+
};
|
|
778
|
+
if (req.captcha_token) payload.captcha_token = req.captcha_token;
|
|
779
|
+
if (req.mfa) payload.mfa = req.mfa;
|
|
780
|
+
const res = await this.request("POST", `${this.prefix}/login`, payload);
|
|
718
781
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
719
782
|
const tp = res.data;
|
|
720
783
|
tp.accessToken = tp.access_token;
|
|
@@ -747,37 +810,32 @@ var AuthService = class extends BaseService {
|
|
|
747
810
|
}
|
|
748
811
|
return res;
|
|
749
812
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
* Les **valeurs**, elles, ne sont validées que par le backend (non vide, sans caractère
|
|
777
|
-
* de contrôle, 512 caractères au plus, jamais deux fois la même clé) — un manquement
|
|
778
|
-
* donne un `400` au démarrage du flux, pas une erreur de cette méthode.
|
|
779
|
-
*/
|
|
780
|
-
async signInWithOAuth(provider, options) {
|
|
813
|
+
async signInWithOAuth(providerOrOptions, rawOptions) {
|
|
814
|
+
let provider;
|
|
815
|
+
let options;
|
|
816
|
+
if (typeof providerOrOptions === "object" && providerOrOptions !== null) {
|
|
817
|
+
provider = providerOrOptions.provider;
|
|
818
|
+
const nestedOptions = providerOrOptions.options;
|
|
819
|
+
options = {
|
|
820
|
+
...providerOrOptions,
|
|
821
|
+
...nestedOptions,
|
|
822
|
+
...rawOptions
|
|
823
|
+
};
|
|
824
|
+
} else {
|
|
825
|
+
provider = providerOrOptions;
|
|
826
|
+
options = rawOptions;
|
|
827
|
+
}
|
|
828
|
+
if (typeof provider !== "string" || provider.trim() === "") {
|
|
829
|
+
return {
|
|
830
|
+
data: null,
|
|
831
|
+
error: new AuraError(0, {
|
|
832
|
+
error: {
|
|
833
|
+
code: "invalid_provider",
|
|
834
|
+
message: "signInWithOAuth: le fournisseur doit \xEAtre une cha\xEEne non vide, par exemple signInWithOAuth('google', { redirectTo }) ou signInWithOAuth({ provider: 'google', redirectTo })"
|
|
835
|
+
}
|
|
836
|
+
})
|
|
837
|
+
};
|
|
838
|
+
}
|
|
781
839
|
const params = new URLSearchParams();
|
|
782
840
|
if (options?.redirectTo) params.set("redirect_uri", options.redirectTo);
|
|
783
841
|
if (options?.scopes) params.set("scopes", options.scopes);
|
|
@@ -839,9 +897,15 @@ var AuthService = class extends BaseService {
|
|
|
839
897
|
}
|
|
840
898
|
return { data: { url }, error: null };
|
|
841
899
|
}
|
|
900
|
+
/**
|
|
901
|
+
* Envoie un lien de connexion par e-mail (« magic link »). La session s'obtient ensuite par `verifyOtp({ type: 'magiclink' })`.
|
|
902
|
+
*/
|
|
842
903
|
async signInWithMagicLink(req) {
|
|
843
904
|
return this.request("POST", `${this.prefix}/magic-link`, req);
|
|
844
905
|
}
|
|
906
|
+
/**
|
|
907
|
+
* Crée une session anonyme (utilisateur sans e-mail), enregistrée et signalée par `SIGNED_IN`.
|
|
908
|
+
*/
|
|
845
909
|
async signInAnonymously() {
|
|
846
910
|
const res = await this.request("POST", `${this.prefix}/anonymous`);
|
|
847
911
|
if (res.data) {
|
|
@@ -850,6 +914,9 @@ var AuthService = class extends BaseService {
|
|
|
850
914
|
}
|
|
851
915
|
return res;
|
|
852
916
|
}
|
|
917
|
+
/**
|
|
918
|
+
* Déconnecte : révoque le jeton de rafraîchissement côté serveur s'il existe, vide la session locale et émet `SIGNED_OUT`.
|
|
919
|
+
*/
|
|
853
920
|
async signOut() {
|
|
854
921
|
const refreshToken = this.client.authStore.refreshToken;
|
|
855
922
|
if (!refreshToken) {
|
|
@@ -870,6 +937,10 @@ var AuthService = class extends BaseService {
|
|
|
870
937
|
return res;
|
|
871
938
|
}
|
|
872
939
|
// -- Session management -----------------------------------------------------
|
|
940
|
+
/**
|
|
941
|
+
* Rafraîchit la session avec le jeton de rafraîchissement et émet `TOKEN_REFRESHED`.
|
|
942
|
+
* Les rafraîchissements concurrents sont fusionnés en un seul appel.
|
|
943
|
+
*/
|
|
873
944
|
async refreshSession() {
|
|
874
945
|
const res = await refreshOnce(this.client);
|
|
875
946
|
if (res.data) {
|
|
@@ -904,6 +975,10 @@ var AuthService = class extends BaseService {
|
|
|
904
975
|
user
|
|
905
976
|
});
|
|
906
977
|
}
|
|
978
|
+
/**
|
|
979
|
+
* Installe une session à partir d'un jeton d'accès et d'un jeton de rafraîchissement existants (par exemple reçus d'un serveur).
|
|
980
|
+
* Un jeton d'accès expiré est rafraîchi ; une session invalide est refusée et l'état précédent est restauré.
|
|
981
|
+
*/
|
|
907
982
|
async setSession(accessToken, refreshToken) {
|
|
908
983
|
const store = this.client.authStore;
|
|
909
984
|
const prev = { token: store.token, refreshToken: store.refreshToken, user: store.user };
|
|
@@ -990,6 +1065,9 @@ var AuthService = class extends BaseService {
|
|
|
990
1065
|
this.client.authStore.removeItem(verifierKey);
|
|
991
1066
|
}
|
|
992
1067
|
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Liste les sessions de l'utilisateur connecté (appareil, adresse IP, dates) ; `is_current` repère la session courante.
|
|
1070
|
+
*/
|
|
993
1071
|
async listSessions() {
|
|
994
1072
|
const store = this.client.authStore;
|
|
995
1073
|
if (store.token && store.refreshToken && !store.isValid) {
|
|
@@ -1003,9 +1081,13 @@ var AuthService = class extends BaseService {
|
|
|
1003
1081
|
headers: refreshToken ? { "x-refresh-token": refreshToken } : void 0
|
|
1004
1082
|
});
|
|
1005
1083
|
}
|
|
1084
|
+
/** Révoque une session de l'utilisateur connecté par son identifiant. */
|
|
1006
1085
|
async revokeSession(sessionId) {
|
|
1007
1086
|
return this.request("DELETE", `${this.prefix}/sessions/${sessionId}`);
|
|
1008
1087
|
}
|
|
1088
|
+
/**
|
|
1089
|
+
* Déconnecte l'utilisateur partout : révoque toutes ses sessions, vide la session locale et émet `SIGNED_OUT`.
|
|
1090
|
+
*/
|
|
1009
1091
|
async revokeAllSessions() {
|
|
1010
1092
|
const rt = this.client.authStore.refreshToken;
|
|
1011
1093
|
if (!rt) {
|
|
@@ -1041,13 +1123,26 @@ var AuthService = class extends BaseService {
|
|
|
1041
1123
|
* applique l'isolation projet native : un token d'un AUTRE projet → 403.
|
|
1042
1124
|
*/
|
|
1043
1125
|
async getUser(jwt) {
|
|
1126
|
+
let res;
|
|
1044
1127
|
if (jwt !== void 0) {
|
|
1045
|
-
|
|
1128
|
+
res = await this.request("GET", `${this.prefix}/user`, void 0, {
|
|
1046
1129
|
authToken: jwt,
|
|
1047
1130
|
skipAuthRefresh: true
|
|
1048
1131
|
});
|
|
1132
|
+
} else {
|
|
1133
|
+
res = await this.request("GET", `${this.prefix}/user`);
|
|
1134
|
+
}
|
|
1135
|
+
if (res.data && typeof res.data === "object") {
|
|
1136
|
+
const userObj = res.data;
|
|
1137
|
+
Object.defineProperty(userObj, "user", {
|
|
1138
|
+
get() {
|
|
1139
|
+
return userObj;
|
|
1140
|
+
},
|
|
1141
|
+
enumerable: false,
|
|
1142
|
+
configurable: true
|
|
1143
|
+
});
|
|
1049
1144
|
}
|
|
1050
|
-
return
|
|
1145
|
+
return res;
|
|
1051
1146
|
}
|
|
1052
1147
|
/**
|
|
1053
1148
|
* Vérifie et décode les claims d'un JWT.
|
|
@@ -1186,6 +1281,9 @@ var AuthService = class extends BaseService {
|
|
|
1186
1281
|
error: new AuraError(0, { error: { code: r.code, message: `getClaims: ${r.code}` } })
|
|
1187
1282
|
};
|
|
1188
1283
|
}
|
|
1284
|
+
/**
|
|
1285
|
+
* Supprime le compte de l'utilisateur connecté après confirmation par son mot de passe, puis vide la session locale.
|
|
1286
|
+
*/
|
|
1189
1287
|
async deleteUser(password) {
|
|
1190
1288
|
const res = await this.request("DELETE", `${this.prefix}/user`, { password });
|
|
1191
1289
|
if (!res.error) {
|
|
@@ -1194,6 +1292,9 @@ var AuthService = class extends BaseService {
|
|
|
1194
1292
|
}
|
|
1195
1293
|
return res;
|
|
1196
1294
|
}
|
|
1295
|
+
/**
|
|
1296
|
+
* Met à jour l'utilisateur connecté (métadonnées, mot de passe…) et émet `USER_UPDATED`. Un changement d'e-mail ne prend effet qu'après confirmation par `verifyOtp({ type: 'email_change' })`.
|
|
1297
|
+
*/
|
|
1197
1298
|
async updateUser(req) {
|
|
1198
1299
|
const res = await this.request("PUT", `${this.prefix}/user`, req);
|
|
1199
1300
|
if (res.data) {
|
|
@@ -1206,9 +1307,14 @@ var AuthService = class extends BaseService {
|
|
|
1206
1307
|
return res;
|
|
1207
1308
|
}
|
|
1208
1309
|
// -- Password recovery ------------------------------------------------------
|
|
1209
|
-
|
|
1210
|
-
|
|
1310
|
+
/** Envoie un e-mail de réinitialisation du mot de passe (accepte un email sous forme de chaîne ou un objet PasswordResetRequest). */
|
|
1311
|
+
async resetPasswordForEmail(emailOrReq) {
|
|
1312
|
+
const body = typeof emailOrReq === "string" ? { email: emailOrReq } : emailOrReq;
|
|
1313
|
+
return this.request("POST", `${this.prefix}/forgot-password`, body);
|
|
1211
1314
|
}
|
|
1315
|
+
/**
|
|
1316
|
+
* Change le mot de passe de l'utilisateur connecté. Le serveur révoque toutes ses sessions : le SDK vide la session locale et émet `SIGNED_OUT`.
|
|
1317
|
+
*/
|
|
1212
1318
|
async updatePassword(newPassword, currentPassword) {
|
|
1213
1319
|
const res = await this.request("PUT", `${this.prefix}/user`, {
|
|
1214
1320
|
password: newPassword,
|
|
@@ -1221,12 +1327,39 @@ var AuthService = class extends BaseService {
|
|
|
1221
1327
|
return res;
|
|
1222
1328
|
}
|
|
1223
1329
|
// -- MFA --------------------------------------------------------------------
|
|
1330
|
+
/**
|
|
1331
|
+
* Façade unifiée pour les opérations MFA (TOTP).
|
|
1332
|
+
* Permet d'appeler indifféremment `aura.auth.mfa.enroll()` ou `aura.auth.mfaEnroll()`.
|
|
1333
|
+
*/
|
|
1334
|
+
get mfa() {
|
|
1335
|
+
return {
|
|
1336
|
+
enroll: () => this.mfaEnroll(),
|
|
1337
|
+
verifySetup: (codeOrParams) => {
|
|
1338
|
+
const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
|
|
1339
|
+
return this.mfaVerifySetup(code);
|
|
1340
|
+
},
|
|
1341
|
+
verify: (req) => this.mfaVerify(req),
|
|
1342
|
+
unenroll: (passwordOrParams) => {
|
|
1343
|
+
const password = typeof passwordOrParams === "string" ? passwordOrParams : passwordOrParams.password;
|
|
1344
|
+
return this.mfaUnenroll(password);
|
|
1345
|
+
},
|
|
1346
|
+
regenerateRecoveryCodes: (codeOrParams) => {
|
|
1347
|
+
const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
|
|
1348
|
+
return this.regenerateRecoveryCodes(code);
|
|
1349
|
+
}
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
/** MFA : démarre l'enrôlement TOTP et renvoie le `secret` et l'URL `otpauth_url` à afficher en QR code. */
|
|
1224
1353
|
async mfaEnroll() {
|
|
1225
1354
|
return this.request("POST", `${this.prefix}/mfa/setup`);
|
|
1226
1355
|
}
|
|
1356
|
+
/** MFA : confirme l'enrôlement avec un premier code et renvoie les codes de récupération. */
|
|
1227
1357
|
async mfaVerifySetup(code) {
|
|
1228
1358
|
return this.request("POST", `${this.prefix}/mfa/setup/verify`, { code });
|
|
1229
1359
|
}
|
|
1360
|
+
/**
|
|
1361
|
+
* MFA : termine une connexion qui a renvoyé un défi (`mfa_token` et code TOTP). Enregistre la session et émet `SIGNED_IN`.
|
|
1362
|
+
*/
|
|
1230
1363
|
async mfaVerify(req) {
|
|
1231
1364
|
const res = await this.request("POST", `${this.prefix}/mfa/verify-login`, req);
|
|
1232
1365
|
if (res.data) {
|
|
@@ -1235,6 +1368,7 @@ var AuthService = class extends BaseService {
|
|
|
1235
1368
|
}
|
|
1236
1369
|
return res;
|
|
1237
1370
|
}
|
|
1371
|
+
/** MFA : désactive le MFA après confirmation par le mot de passe. */
|
|
1238
1372
|
async mfaUnenroll(password) {
|
|
1239
1373
|
return this.request("POST", `${this.prefix}/mfa/disable`, { password });
|
|
1240
1374
|
}
|
|
@@ -1306,6 +1440,7 @@ var AuthService = class extends BaseService {
|
|
|
1306
1440
|
return res;
|
|
1307
1441
|
}
|
|
1308
1442
|
// -- Email verification -----------------------------------------------------
|
|
1443
|
+
/** Renvoie l'e-mail de vérification, à `email` ou à l'adresse de l'utilisateur connecté. */
|
|
1309
1444
|
async resendVerificationEmail(email) {
|
|
1310
1445
|
const e = email ?? this.client.authStore.user?.email;
|
|
1311
1446
|
if (!e) {
|
|
@@ -1317,24 +1452,34 @@ var AuthService = class extends BaseService {
|
|
|
1317
1452
|
return this.request("POST", `${this.prefix}/resend-verification`, { email: e });
|
|
1318
1453
|
}
|
|
1319
1454
|
// -- Email OTP (Phase 2) --------------------------------------------------
|
|
1455
|
+
/**
|
|
1456
|
+
* Envoie un code à usage unique par e-mail ; à confirmer par `verifyOtp({ type: 'email' })`.
|
|
1457
|
+
*/
|
|
1320
1458
|
async signInWithEmailOtp(email) {
|
|
1321
1459
|
return this.request("POST", `${this.prefix}/email-otp/send`, { email });
|
|
1322
1460
|
}
|
|
1323
1461
|
// -- SMS OTP (Phase 2) ----------------------------------------------------
|
|
1462
|
+
/** Envoie un code à usage unique par SMS ; à confirmer par `verifyOtp({ type: 'sms' })`. */
|
|
1324
1463
|
async signInWithSmsOtp(phone) {
|
|
1325
1464
|
return this.request("POST", `${this.prefix}/sms/send`, { phone });
|
|
1326
1465
|
}
|
|
1327
1466
|
// -- Identity linking (Phase 2) -------------------------------------------
|
|
1467
|
+
/** Liste les identités (fournisseurs) liées à l'utilisateur connecté. */
|
|
1328
1468
|
async listIdentities() {
|
|
1329
1469
|
return this.request("GET", `${this.prefix}/user/identities`);
|
|
1330
1470
|
}
|
|
1471
|
+
/**
|
|
1472
|
+
* Démarre la liaison d'un fournisseur OAuth au compte connecté et renvoie l'URL d'autorisation à ouvrir.
|
|
1473
|
+
*/
|
|
1331
1474
|
async linkIdentity(provider) {
|
|
1332
1475
|
return this.request("POST", `${this.prefix}/user/identities/link/${provider}`);
|
|
1333
1476
|
}
|
|
1477
|
+
/** Détache une identité du compte connecté par son identifiant. */
|
|
1334
1478
|
async unlinkIdentity(identityId) {
|
|
1335
1479
|
return this.request("DELETE", `${this.prefix}/user/identities/${identityId}`);
|
|
1336
1480
|
}
|
|
1337
1481
|
// -- MFA recovery codes (Phase 2) -----------------------------------------
|
|
1482
|
+
/** MFA : régénère les codes de récupération après confirmation par un code TOTP. */
|
|
1338
1483
|
async regenerateRecoveryCodes(code) {
|
|
1339
1484
|
return this.request("POST", `${this.prefix}/mfa/recovery-codes/regenerate`, { code });
|
|
1340
1485
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aurabase/auth",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Service d'authentification du SDK Aurabase (sessions, OAuth/PKCE, MFA, magic link, OTP, admin)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"author": "Aurabase",
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
|
-
"url": "git+https://github.com/
|
|
34
|
+
"url": "git+https://github.com/Aurabase-cloud/Aurabase.git",
|
|
35
35
|
"directory": "aurabase-js/packages/auth"
|
|
36
36
|
},
|
|
37
37
|
"homepage": "https://aurabase.cloud",
|
|
38
38
|
"bugs": {
|
|
39
|
-
"url": "https://github.com/
|
|
39
|
+
"url": "https://github.com/Aurabase-cloud/Aurabase/issues"
|
|
40
40
|
},
|
|
41
41
|
"keywords": [
|
|
42
42
|
"aurabase",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"authentication"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@aurabase/core": "0.6.
|
|
49
|
+
"@aurabase/core": "0.6.2"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "20.14.15",
|