@aurabase/auth 0.5.2 → 0.5.4
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 +2 -1
- package/dist/index.cjs +92 -26
- package/dist/index.d.cts +14 -12
- package/dist/index.d.ts +14 -12
- package/dist/index.js +92 -26
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -192,7 +192,8 @@ await aura.auth.promoteAnonymous({ email: 'user@example.com', password: 'correct
|
|
|
192
192
|
const { data: user } = await aura.auth.getUser()
|
|
193
193
|
|
|
194
194
|
// Vérification locale JWKS (RS256/ES256) avec fallback getUser() (HS256 / JWKS vide).
|
|
195
|
-
const { data
|
|
195
|
+
const { data } = await aura.auth.getClaims()
|
|
196
|
+
console.log(data?.claims.sub, data?.header.alg)
|
|
196
197
|
|
|
197
198
|
await aura.auth.updateUser({ data: { display_name: 'Ada' } })
|
|
198
199
|
|
package/dist/index.cjs
CHANGED
|
@@ -633,25 +633,49 @@ var AuthService = class extends core.BaseService {
|
|
|
633
633
|
}
|
|
634
634
|
// -- Auth state change ------------------------------------------------------
|
|
635
635
|
onAuthStateChange(callback) {
|
|
636
|
-
|
|
637
|
-
|
|
636
|
+
const unsub = () => {
|
|
637
|
+
this._stateListeners.delete(callback);
|
|
638
|
+
};
|
|
639
|
+
const result = {
|
|
640
|
+
unsubscribe: unsub,
|
|
641
|
+
data: {
|
|
642
|
+
subscription: {
|
|
643
|
+
unsubscribe: unsub
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
if (this._disposed) return result;
|
|
638
648
|
this._stateListeners.add(callback);
|
|
639
649
|
const store = this.client.authStore;
|
|
640
650
|
queueMicrotask(() => {
|
|
641
651
|
if (this._stateListeners.has(callback)) {
|
|
642
|
-
|
|
652
|
+
const session = store.token && store.user ? {
|
|
653
|
+
access_token: store.token,
|
|
654
|
+
refresh_token: store.refreshToken ?? "",
|
|
655
|
+
accessToken: store.token,
|
|
656
|
+
refreshToken: store.refreshToken ?? "",
|
|
657
|
+
token_type: "Bearer",
|
|
658
|
+
expires_in: 900,
|
|
659
|
+
user: store.user
|
|
660
|
+
} : null;
|
|
661
|
+
callback({ event: "INITIAL_SESSION", user: store.user, accessToken: store.token, session });
|
|
643
662
|
}
|
|
644
663
|
});
|
|
645
|
-
return
|
|
646
|
-
unsubscribe: () => {
|
|
647
|
-
this._stateListeners.delete(callback);
|
|
648
|
-
}
|
|
649
|
-
};
|
|
664
|
+
return result;
|
|
650
665
|
}
|
|
651
666
|
_emitEvent(event, user, accessToken, extra) {
|
|
667
|
+
const session = accessToken && user ? {
|
|
668
|
+
access_token: accessToken,
|
|
669
|
+
refresh_token: this.client.authStore.refreshToken ?? "",
|
|
670
|
+
accessToken,
|
|
671
|
+
refreshToken: this.client.authStore.refreshToken ?? "",
|
|
672
|
+
token_type: "Bearer",
|
|
673
|
+
expires_in: 900,
|
|
674
|
+
user
|
|
675
|
+
} : null;
|
|
652
676
|
for (const cb of this._stateListeners) {
|
|
653
677
|
try {
|
|
654
|
-
cb({ event, user, accessToken, ...extra });
|
|
678
|
+
cb({ event, user, accessToken, session, ...extra });
|
|
655
679
|
} catch {
|
|
656
680
|
}
|
|
657
681
|
}
|
|
@@ -661,11 +685,29 @@ var AuthService = class extends core.BaseService {
|
|
|
661
685
|
const res = await this.request("POST", `${this.prefix}/register`, req);
|
|
662
686
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
663
687
|
const tp = res.data;
|
|
688
|
+
tp.accessToken = tp.access_token;
|
|
689
|
+
tp.refreshToken = tp.refresh_token;
|
|
690
|
+
tp.session = {
|
|
691
|
+
access_token: tp.access_token,
|
|
692
|
+
refresh_token: tp.refresh_token,
|
|
693
|
+
accessToken: tp.access_token,
|
|
694
|
+
refreshToken: tp.refresh_token,
|
|
695
|
+
token_type: tp.token_type,
|
|
696
|
+
expires_in: tp.expires_in,
|
|
697
|
+
user: tp.user,
|
|
698
|
+
provider_token: tp.provider_token,
|
|
699
|
+
provider_refresh_token: tp.provider_refresh_token
|
|
700
|
+
};
|
|
664
701
|
this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
|
|
665
702
|
this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
|
|
666
703
|
}
|
|
667
704
|
if (res.data && isMfaChallenge(res.data)) {
|
|
668
705
|
const mfa = res.data;
|
|
706
|
+
mfa.mfaChallenge = {
|
|
707
|
+
mfaRequired: mfa.mfa_required,
|
|
708
|
+
mfaToken: mfa.mfa_token,
|
|
709
|
+
mfaSetupRequired: mfa.mfa_setup_required
|
|
710
|
+
};
|
|
669
711
|
this._emitEvent("MFA_CHALLENGE", null, null, {
|
|
670
712
|
mfaToken: mfa.mfa_token,
|
|
671
713
|
mfaSetupRequired: mfa.mfa_setup_required
|
|
@@ -677,11 +719,29 @@ var AuthService = class extends core.BaseService {
|
|
|
677
719
|
const res = await this.request("POST", `${this.prefix}/login`, req);
|
|
678
720
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
679
721
|
const tp = res.data;
|
|
722
|
+
tp.accessToken = tp.access_token;
|
|
723
|
+
tp.refreshToken = tp.refresh_token;
|
|
724
|
+
tp.session = {
|
|
725
|
+
access_token: tp.access_token,
|
|
726
|
+
refresh_token: tp.refresh_token,
|
|
727
|
+
accessToken: tp.access_token,
|
|
728
|
+
refreshToken: tp.refresh_token,
|
|
729
|
+
token_type: tp.token_type,
|
|
730
|
+
expires_in: tp.expires_in,
|
|
731
|
+
user: tp.user,
|
|
732
|
+
provider_token: tp.provider_token,
|
|
733
|
+
provider_refresh_token: tp.provider_refresh_token
|
|
734
|
+
};
|
|
680
735
|
this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
|
|
681
736
|
this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
|
|
682
737
|
}
|
|
683
738
|
if (res.data && isMfaChallenge(res.data)) {
|
|
684
739
|
const mfa = res.data;
|
|
740
|
+
mfa.mfaChallenge = {
|
|
741
|
+
mfaRequired: mfa.mfa_required,
|
|
742
|
+
mfaToken: mfa.mfa_token,
|
|
743
|
+
mfaSetupRequired: mfa.mfa_setup_required
|
|
744
|
+
};
|
|
685
745
|
this._emitEvent("MFA_CHALLENGE", null, null, {
|
|
686
746
|
mfaToken: mfa.mfa_token,
|
|
687
747
|
mfaSetupRequired: mfa.mfa_setup_required
|
|
@@ -822,22 +882,28 @@ var AuthService = class extends core.BaseService {
|
|
|
822
882
|
/**
|
|
823
883
|
* Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
|
|
824
884
|
*
|
|
825
|
-
*
|
|
826
|
-
*
|
|
827
|
-
*
|
|
828
|
-
* `getSession()` renvoie directement `{accessToken, user}` (pas d'enveloppe
|
|
829
|
-
* `{data, error}`, pas de `refreshToken`/`expiresAt`). Ce choix est délibéré :
|
|
830
|
-
* cette méthode ne fait aucune requête réseau et ne peut donc jamais échouer
|
|
831
|
-
* (`error` serait toujours `null`) — l'envelopper aurait été un contrat menteur.
|
|
832
|
-
* Le `refreshToken` n'est pas exposé pour éviter qu'un consommateur le manipule
|
|
833
|
-
* hors du store (contrairement à `accessToken`, souvent nécessaire pour des appels
|
|
834
|
-
* `fetch` manuels côté app). Pour la session complète, lire `client.authStore`
|
|
835
|
-
* directement (`.token`, `.refreshToken`, `.user`, `.isValid`).
|
|
885
|
+
* DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
|
|
886
|
+
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
887
|
+
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
836
888
|
*/
|
|
837
889
|
getSession() {
|
|
890
|
+
const token = this.client.authStore.token;
|
|
891
|
+
const user = this.client.authStore.user;
|
|
892
|
+
const session = token && user ? {
|
|
893
|
+
access_token: token,
|
|
894
|
+
refresh_token: this.client.authStore.refreshToken ?? "",
|
|
895
|
+
accessToken: token,
|
|
896
|
+
refreshToken: this.client.authStore.refreshToken ?? "",
|
|
897
|
+
token_type: "Bearer",
|
|
898
|
+
expires_in: 900,
|
|
899
|
+
user
|
|
900
|
+
} : null;
|
|
838
901
|
return Promise.resolve({
|
|
839
|
-
|
|
840
|
-
|
|
902
|
+
data: { session },
|
|
903
|
+
error: null,
|
|
904
|
+
accessToken: token,
|
|
905
|
+
access_token: token,
|
|
906
|
+
user
|
|
841
907
|
});
|
|
842
908
|
}
|
|
843
909
|
async setSession(accessToken, refreshToken) {
|
|
@@ -1066,7 +1132,7 @@ var AuthService = class extends core.BaseService {
|
|
|
1066
1132
|
})
|
|
1067
1133
|
};
|
|
1068
1134
|
}
|
|
1069
|
-
return { data: { claims, header: r.header }, error: null };
|
|
1135
|
+
return { data: { ...claims, claims, header: r.header }, error: null };
|
|
1070
1136
|
}
|
|
1071
1137
|
if (r.code === "unsupported_alg" || r.code === "no_matching_key" || r.code === "jwks_fetch_failed") {
|
|
1072
1138
|
let localPayload = {};
|
|
@@ -1094,11 +1160,11 @@ var AuthService = class extends core.BaseService {
|
|
|
1094
1160
|
realAlg = decodeJwt(token).header.alg ?? "unknown";
|
|
1095
1161
|
} catch {
|
|
1096
1162
|
}
|
|
1163
|
+
const claims = { ...u.data, sub: u.data.id };
|
|
1097
1164
|
return {
|
|
1098
1165
|
data: {
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
claims: { ...u.data, sub: u.data.id },
|
|
1166
|
+
...claims,
|
|
1167
|
+
claims,
|
|
1102
1168
|
header: { alg: realAlg }
|
|
1103
1169
|
},
|
|
1104
1170
|
error: null
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, MagicLinkRequest, TokenPair, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
|
|
1
|
+
import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
|
|
2
2
|
|
|
3
3
|
declare class AuthAdminService extends BaseService {
|
|
4
4
|
/**
|
|
@@ -206,6 +206,11 @@ declare class AuthService extends BaseService {
|
|
|
206
206
|
private get _oauthInitiatedKey();
|
|
207
207
|
onAuthStateChange(callback: AuthStateCallback): {
|
|
208
208
|
unsubscribe: () => void;
|
|
209
|
+
data: {
|
|
210
|
+
subscription: {
|
|
211
|
+
unsubscribe: () => void;
|
|
212
|
+
};
|
|
213
|
+
};
|
|
209
214
|
};
|
|
210
215
|
private _emitEvent;
|
|
211
216
|
signUp(req: SignUpRequest): Promise<AuraResponse<LoginResponse>>;
|
|
@@ -252,20 +257,17 @@ declare class AuthService extends BaseService {
|
|
|
252
257
|
/**
|
|
253
258
|
* Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
|
|
254
259
|
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* `getSession()` renvoie directement `{accessToken, user}` (pas d'enveloppe
|
|
259
|
-
* `{data, error}`, pas de `refreshToken`/`expiresAt`). Ce choix est délibéré :
|
|
260
|
-
* cette méthode ne fait aucune requête réseau et ne peut donc jamais échouer
|
|
261
|
-
* (`error` serait toujours `null`) — l'envelopper aurait été un contrat menteur.
|
|
262
|
-
* Le `refreshToken` n'est pas exposé pour éviter qu'un consommateur le manipule
|
|
263
|
-
* hors du store (contrairement à `accessToken`, souvent nécessaire pour des appels
|
|
264
|
-
* `fetch` manuels côté app). Pour la session complète, lire `client.authStore`
|
|
265
|
-
* directement (`.token`, `.refreshToken`, `.user`, `.isValid`).
|
|
260
|
+
* DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
|
|
261
|
+
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
262
|
+
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
266
263
|
*/
|
|
267
264
|
getSession(): Promise<{
|
|
265
|
+
data: {
|
|
266
|
+
session: Session | null;
|
|
267
|
+
};
|
|
268
|
+
error: null;
|
|
268
269
|
accessToken: string | null;
|
|
270
|
+
access_token: string | null;
|
|
269
271
|
user: User | null;
|
|
270
272
|
}>;
|
|
271
273
|
setSession(accessToken: string, refreshToken: string): Promise<AuraResponse<User>>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, MagicLinkRequest, TokenPair, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
|
|
1
|
+
import { BaseService, AuraResponse, AdminUser, AdminCreateUserRequest, AdminUpdateUserRequest, GenerateLinkType, GenerateLinkResult, UserStats, IdentityInfo, AdminSessionInfo, AuditLogEntry, AuthSettings, AuthSettingsUpdate, EmailTemplateUpdate, AuraClientLike, AuthChangePayload, SignUpRequest, LoginResponse, SignInRequest, OAuthSignInOptions, MagicLinkRequest, TokenPair, Session, User, SessionInfo, GetClaimsResult, UpdateUserRequest, PasswordResetRequest, MfaEnrollResponse, MfaVerifyRequest, MfaChallenge } from '@aurabase/core';
|
|
2
2
|
|
|
3
3
|
declare class AuthAdminService extends BaseService {
|
|
4
4
|
/**
|
|
@@ -206,6 +206,11 @@ declare class AuthService extends BaseService {
|
|
|
206
206
|
private get _oauthInitiatedKey();
|
|
207
207
|
onAuthStateChange(callback: AuthStateCallback): {
|
|
208
208
|
unsubscribe: () => void;
|
|
209
|
+
data: {
|
|
210
|
+
subscription: {
|
|
211
|
+
unsubscribe: () => void;
|
|
212
|
+
};
|
|
213
|
+
};
|
|
209
214
|
};
|
|
210
215
|
private _emitEvent;
|
|
211
216
|
signUp(req: SignUpRequest): Promise<AuraResponse<LoginResponse>>;
|
|
@@ -252,20 +257,17 @@ declare class AuthService extends BaseService {
|
|
|
252
257
|
/**
|
|
253
258
|
* Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
|
|
254
259
|
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
* `getSession()` renvoie directement `{accessToken, user}` (pas d'enveloppe
|
|
259
|
-
* `{data, error}`, pas de `refreshToken`/`expiresAt`). Ce choix est délibéré :
|
|
260
|
-
* cette méthode ne fait aucune requête réseau et ne peut donc jamais échouer
|
|
261
|
-
* (`error` serait toujours `null`) — l'envelopper aurait été un contrat menteur.
|
|
262
|
-
* Le `refreshToken` n'est pas exposé pour éviter qu'un consommateur le manipule
|
|
263
|
-
* hors du store (contrairement à `accessToken`, souvent nécessaire pour des appels
|
|
264
|
-
* `fetch` manuels côté app). Pour la session complète, lire `client.authStore`
|
|
265
|
-
* directement (`.token`, `.refreshToken`, `.user`, `.isValid`).
|
|
260
|
+
* DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
|
|
261
|
+
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
262
|
+
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
266
263
|
*/
|
|
267
264
|
getSession(): Promise<{
|
|
265
|
+
data: {
|
|
266
|
+
session: Session | null;
|
|
267
|
+
};
|
|
268
|
+
error: null;
|
|
268
269
|
accessToken: string | null;
|
|
270
|
+
access_token: string | null;
|
|
269
271
|
user: User | null;
|
|
270
272
|
}>;
|
|
271
273
|
setSession(accessToken: string, refreshToken: string): Promise<AuraResponse<User>>;
|
package/dist/index.js
CHANGED
|
@@ -631,25 +631,49 @@ var AuthService = class extends BaseService {
|
|
|
631
631
|
}
|
|
632
632
|
// -- Auth state change ------------------------------------------------------
|
|
633
633
|
onAuthStateChange(callback) {
|
|
634
|
-
|
|
635
|
-
|
|
634
|
+
const unsub = () => {
|
|
635
|
+
this._stateListeners.delete(callback);
|
|
636
|
+
};
|
|
637
|
+
const result = {
|
|
638
|
+
unsubscribe: unsub,
|
|
639
|
+
data: {
|
|
640
|
+
subscription: {
|
|
641
|
+
unsubscribe: unsub
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
};
|
|
645
|
+
if (this._disposed) return result;
|
|
636
646
|
this._stateListeners.add(callback);
|
|
637
647
|
const store = this.client.authStore;
|
|
638
648
|
queueMicrotask(() => {
|
|
639
649
|
if (this._stateListeners.has(callback)) {
|
|
640
|
-
|
|
650
|
+
const session = store.token && store.user ? {
|
|
651
|
+
access_token: store.token,
|
|
652
|
+
refresh_token: store.refreshToken ?? "",
|
|
653
|
+
accessToken: store.token,
|
|
654
|
+
refreshToken: store.refreshToken ?? "",
|
|
655
|
+
token_type: "Bearer",
|
|
656
|
+
expires_in: 900,
|
|
657
|
+
user: store.user
|
|
658
|
+
} : null;
|
|
659
|
+
callback({ event: "INITIAL_SESSION", user: store.user, accessToken: store.token, session });
|
|
641
660
|
}
|
|
642
661
|
});
|
|
643
|
-
return
|
|
644
|
-
unsubscribe: () => {
|
|
645
|
-
this._stateListeners.delete(callback);
|
|
646
|
-
}
|
|
647
|
-
};
|
|
662
|
+
return result;
|
|
648
663
|
}
|
|
649
664
|
_emitEvent(event, user, accessToken, extra) {
|
|
665
|
+
const session = accessToken && user ? {
|
|
666
|
+
access_token: accessToken,
|
|
667
|
+
refresh_token: this.client.authStore.refreshToken ?? "",
|
|
668
|
+
accessToken,
|
|
669
|
+
refreshToken: this.client.authStore.refreshToken ?? "",
|
|
670
|
+
token_type: "Bearer",
|
|
671
|
+
expires_in: 900,
|
|
672
|
+
user
|
|
673
|
+
} : null;
|
|
650
674
|
for (const cb of this._stateListeners) {
|
|
651
675
|
try {
|
|
652
|
-
cb({ event, user, accessToken, ...extra });
|
|
676
|
+
cb({ event, user, accessToken, session, ...extra });
|
|
653
677
|
} catch {
|
|
654
678
|
}
|
|
655
679
|
}
|
|
@@ -659,11 +683,29 @@ var AuthService = class extends BaseService {
|
|
|
659
683
|
const res = await this.request("POST", `${this.prefix}/register`, req);
|
|
660
684
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
661
685
|
const tp = res.data;
|
|
686
|
+
tp.accessToken = tp.access_token;
|
|
687
|
+
tp.refreshToken = tp.refresh_token;
|
|
688
|
+
tp.session = {
|
|
689
|
+
access_token: tp.access_token,
|
|
690
|
+
refresh_token: tp.refresh_token,
|
|
691
|
+
accessToken: tp.access_token,
|
|
692
|
+
refreshToken: tp.refresh_token,
|
|
693
|
+
token_type: tp.token_type,
|
|
694
|
+
expires_in: tp.expires_in,
|
|
695
|
+
user: tp.user,
|
|
696
|
+
provider_token: tp.provider_token,
|
|
697
|
+
provider_refresh_token: tp.provider_refresh_token
|
|
698
|
+
};
|
|
662
699
|
this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
|
|
663
700
|
this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
|
|
664
701
|
}
|
|
665
702
|
if (res.data && isMfaChallenge(res.data)) {
|
|
666
703
|
const mfa = res.data;
|
|
704
|
+
mfa.mfaChallenge = {
|
|
705
|
+
mfaRequired: mfa.mfa_required,
|
|
706
|
+
mfaToken: mfa.mfa_token,
|
|
707
|
+
mfaSetupRequired: mfa.mfa_setup_required
|
|
708
|
+
};
|
|
667
709
|
this._emitEvent("MFA_CHALLENGE", null, null, {
|
|
668
710
|
mfaToken: mfa.mfa_token,
|
|
669
711
|
mfaSetupRequired: mfa.mfa_setup_required
|
|
@@ -675,11 +717,29 @@ var AuthService = class extends BaseService {
|
|
|
675
717
|
const res = await this.request("POST", `${this.prefix}/login`, req);
|
|
676
718
|
if (res.data && !isMfaChallenge(res.data)) {
|
|
677
719
|
const tp = res.data;
|
|
720
|
+
tp.accessToken = tp.access_token;
|
|
721
|
+
tp.refreshToken = tp.refresh_token;
|
|
722
|
+
tp.session = {
|
|
723
|
+
access_token: tp.access_token,
|
|
724
|
+
refresh_token: tp.refresh_token,
|
|
725
|
+
accessToken: tp.access_token,
|
|
726
|
+
refreshToken: tp.refresh_token,
|
|
727
|
+
token_type: tp.token_type,
|
|
728
|
+
expires_in: tp.expires_in,
|
|
729
|
+
user: tp.user,
|
|
730
|
+
provider_token: tp.provider_token,
|
|
731
|
+
provider_refresh_token: tp.provider_refresh_token
|
|
732
|
+
};
|
|
678
733
|
this.client.authStore.save(tp.access_token, tp.refresh_token, tp.user);
|
|
679
734
|
this._emitEvent("SIGNED_IN", tp.user, tp.access_token);
|
|
680
735
|
}
|
|
681
736
|
if (res.data && isMfaChallenge(res.data)) {
|
|
682
737
|
const mfa = res.data;
|
|
738
|
+
mfa.mfaChallenge = {
|
|
739
|
+
mfaRequired: mfa.mfa_required,
|
|
740
|
+
mfaToken: mfa.mfa_token,
|
|
741
|
+
mfaSetupRequired: mfa.mfa_setup_required
|
|
742
|
+
};
|
|
683
743
|
this._emitEvent("MFA_CHALLENGE", null, null, {
|
|
684
744
|
mfaToken: mfa.mfa_token,
|
|
685
745
|
mfaSetupRequired: mfa.mfa_setup_required
|
|
@@ -820,22 +880,28 @@ var AuthService = class extends BaseService {
|
|
|
820
880
|
/**
|
|
821
881
|
* Session courante lue depuis le store (synchrone en pratique, pas d'appel réseau).
|
|
822
882
|
*
|
|
823
|
-
*
|
|
824
|
-
*
|
|
825
|
-
*
|
|
826
|
-
* `getSession()` renvoie directement `{accessToken, user}` (pas d'enveloppe
|
|
827
|
-
* `{data, error}`, pas de `refreshToken`/`expiresAt`). Ce choix est délibéré :
|
|
828
|
-
* cette méthode ne fait aucune requête réseau et ne peut donc jamais échouer
|
|
829
|
-
* (`error` serait toujours `null`) — l'envelopper aurait été un contrat menteur.
|
|
830
|
-
* Le `refreshToken` n'est pas exposé pour éviter qu'un consommateur le manipule
|
|
831
|
-
* hors du store (contrairement à `accessToken`, souvent nécessaire pour des appels
|
|
832
|
-
* `fetch` manuels côté app). Pour la session complète, lire `client.authStore`
|
|
833
|
-
* directement (`.token`, `.refreshToken`, `.user`, `.isValid`).
|
|
883
|
+
* DOUBLE COMPATIBILITÉ DX (Parité Supabase & compatibilité existante Aurabase) :
|
|
884
|
+
* - Permet `const { data: { session }, error } = await aura.auth.getSession()` (forme canonique)
|
|
885
|
+
* - Permet `const { accessToken, user } = await aura.auth.getSession()` (forme plate historique)
|
|
834
886
|
*/
|
|
835
887
|
getSession() {
|
|
888
|
+
const token = this.client.authStore.token;
|
|
889
|
+
const user = this.client.authStore.user;
|
|
890
|
+
const session = token && user ? {
|
|
891
|
+
access_token: token,
|
|
892
|
+
refresh_token: this.client.authStore.refreshToken ?? "",
|
|
893
|
+
accessToken: token,
|
|
894
|
+
refreshToken: this.client.authStore.refreshToken ?? "",
|
|
895
|
+
token_type: "Bearer",
|
|
896
|
+
expires_in: 900,
|
|
897
|
+
user
|
|
898
|
+
} : null;
|
|
836
899
|
return Promise.resolve({
|
|
837
|
-
|
|
838
|
-
|
|
900
|
+
data: { session },
|
|
901
|
+
error: null,
|
|
902
|
+
accessToken: token,
|
|
903
|
+
access_token: token,
|
|
904
|
+
user
|
|
839
905
|
});
|
|
840
906
|
}
|
|
841
907
|
async setSession(accessToken, refreshToken) {
|
|
@@ -1064,7 +1130,7 @@ var AuthService = class extends BaseService {
|
|
|
1064
1130
|
})
|
|
1065
1131
|
};
|
|
1066
1132
|
}
|
|
1067
|
-
return { data: { claims, header: r.header }, error: null };
|
|
1133
|
+
return { data: { ...claims, claims, header: r.header }, error: null };
|
|
1068
1134
|
}
|
|
1069
1135
|
if (r.code === "unsupported_alg" || r.code === "no_matching_key" || r.code === "jwks_fetch_failed") {
|
|
1070
1136
|
let localPayload = {};
|
|
@@ -1092,11 +1158,11 @@ var AuthService = class extends BaseService {
|
|
|
1092
1158
|
realAlg = decodeJwt(token).header.alg ?? "unknown";
|
|
1093
1159
|
} catch {
|
|
1094
1160
|
}
|
|
1161
|
+
const claims = { ...u.data, sub: u.data.id };
|
|
1095
1162
|
return {
|
|
1096
1163
|
data: {
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
claims: { ...u.data, sub: u.data.id },
|
|
1164
|
+
...claims,
|
|
1165
|
+
claims,
|
|
1100
1166
|
header: { alg: realAlg }
|
|
1101
1167
|
},
|
|
1102
1168
|
error: null
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aurabase/auth",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
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",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"authentication"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@aurabase/core": "0.5.
|
|
49
|
+
"@aurabase/core": "0.5.4"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "20.14.15",
|