@aurabase/auth 0.7.1 → 0.7.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/dist/index.cjs +68 -15
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +68 -15
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -52,14 +52,34 @@ var AuthAdminService = class extends core.BaseService {
|
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
55
|
-
* Accepte
|
|
55
|
+
* Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
|
|
56
56
|
*/
|
|
57
57
|
async generateLink(userIdOrParams, type) {
|
|
58
58
|
let resolvedUserId;
|
|
59
59
|
let resolvedType;
|
|
60
|
+
let resolvedRedirectTo;
|
|
60
61
|
if (typeof userIdOrParams === "object" && userIdOrParams !== null) {
|
|
61
62
|
resolvedUserId = userIdOrParams.userId ?? userIdOrParams.user_id;
|
|
62
63
|
resolvedType = userIdOrParams.type ?? type;
|
|
64
|
+
resolvedRedirectTo = userIdOrParams.redirectTo ?? userIdOrParams.redirect_to;
|
|
65
|
+
if (!resolvedUserId && userIdOrParams.email) {
|
|
66
|
+
const email = userIdOrParams.email.trim().toLowerCase();
|
|
67
|
+
const searchRes = await this.listUsers({ search: email, limit: 1 });
|
|
68
|
+
const usersList = Array.isArray(searchRes.data) ? searchRes.data : [];
|
|
69
|
+
if (usersList[0]?.id) {
|
|
70
|
+
resolvedUserId = usersList[0].id;
|
|
71
|
+
} else {
|
|
72
|
+
return {
|
|
73
|
+
data: null,
|
|
74
|
+
error: new core.AuraError(404, {
|
|
75
|
+
error: {
|
|
76
|
+
code: "USER_NOT_FOUND",
|
|
77
|
+
message: `No user found with email "${email}".`
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
63
83
|
} else if (typeof userIdOrParams === "string") {
|
|
64
84
|
resolvedUserId = userIdOrParams;
|
|
65
85
|
resolvedType = type;
|
|
@@ -70,7 +90,7 @@ var AuthAdminService = class extends core.BaseService {
|
|
|
70
90
|
error: new core.AuraError(400, {
|
|
71
91
|
error: {
|
|
72
92
|
code: "INVALID_ARGUMENT",
|
|
73
|
-
message: "userId
|
|
93
|
+
message: "userId or email is required. Usage: generateLink({ email, type }) or generateLink(userId, type)."
|
|
74
94
|
}
|
|
75
95
|
})
|
|
76
96
|
};
|
|
@@ -86,7 +106,15 @@ var AuthAdminService = class extends core.BaseService {
|
|
|
86
106
|
})
|
|
87
107
|
};
|
|
88
108
|
}
|
|
89
|
-
|
|
109
|
+
const body = { type: resolvedType };
|
|
110
|
+
if (resolvedRedirectTo) {
|
|
111
|
+
body.redirect_to = resolvedRedirectTo;
|
|
112
|
+
}
|
|
113
|
+
return this.request(
|
|
114
|
+
"POST",
|
|
115
|
+
`${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`,
|
|
116
|
+
body
|
|
117
|
+
);
|
|
90
118
|
}
|
|
91
119
|
/**
|
|
92
120
|
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
@@ -1507,14 +1535,28 @@ var AuthService = class extends core.BaseService {
|
|
|
1507
1535
|
const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
|
|
1508
1536
|
return this.regenerateRecoveryCodes(code);
|
|
1509
1537
|
},
|
|
1510
|
-
factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
|
|
1538
|
+
factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
|
|
1539
|
+
mfa_token: mfaToken
|
|
1540
|
+
}),
|
|
1511
1541
|
sms: {
|
|
1512
1542
|
setup: (phone) => this.request("POST", `${this.prefix}/mfa/sms/setup`, { phone }),
|
|
1513
|
-
verifySetup: (code) => this.request(
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1543
|
+
verifySetup: (code) => this.request(
|
|
1544
|
+
"POST",
|
|
1545
|
+
`${this.prefix}/mfa/sms/setup/verify`,
|
|
1546
|
+
{ code }
|
|
1547
|
+
),
|
|
1548
|
+
send: (mfaToken) => this.request(
|
|
1549
|
+
"POST",
|
|
1550
|
+
`${this.prefix}/mfa/sms/send`,
|
|
1551
|
+
{
|
|
1552
|
+
mfa_token: mfaToken
|
|
1553
|
+
}
|
|
1554
|
+
),
|
|
1555
|
+
remove: (password) => this.request(
|
|
1556
|
+
"DELETE",
|
|
1557
|
+
`${this.prefix}/mfa/sms`,
|
|
1558
|
+
{ password }
|
|
1559
|
+
)
|
|
1518
1560
|
},
|
|
1519
1561
|
webauthn: {
|
|
1520
1562
|
register: (params) => this.webauthnRegister(params),
|
|
@@ -1528,6 +1570,13 @@ var AuthService = class extends core.BaseService {
|
|
|
1528
1570
|
}
|
|
1529
1571
|
};
|
|
1530
1572
|
}
|
|
1573
|
+
/**
|
|
1574
|
+
* API d'administration de l'authentification (alias vers `client.authAdmin`).
|
|
1575
|
+
* Exige une clé `service_role` (côté serveur uniquement).
|
|
1576
|
+
*/
|
|
1577
|
+
get admin() {
|
|
1578
|
+
return this.client.authAdmin;
|
|
1579
|
+
}
|
|
1531
1580
|
webauthnIndisponible() {
|
|
1532
1581
|
return {
|
|
1533
1582
|
data: null,
|
|
@@ -1552,7 +1601,7 @@ var AuthService = class extends core.BaseService {
|
|
|
1552
1601
|
`${this.prefix}/mfa/webauthn/register/start`,
|
|
1553
1602
|
{ friendly_name: params?.friendlyName }
|
|
1554
1603
|
);
|
|
1555
|
-
if (!debut.data) return debut;
|
|
1604
|
+
if (!debut.data) return { data: null, error: debut.error };
|
|
1556
1605
|
let cred;
|
|
1557
1606
|
try {
|
|
1558
1607
|
cred = await conteneur.create(creationOptionsFromJson(debut.data.options));
|
|
@@ -1560,10 +1609,14 @@ var AuthService = class extends core.BaseService {
|
|
|
1560
1609
|
return this.webauthnAnnule(e);
|
|
1561
1610
|
}
|
|
1562
1611
|
if (!cred) return this.webauthnAnnule(new Error("no credential returned"));
|
|
1563
|
-
return this.request(
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1612
|
+
return this.request(
|
|
1613
|
+
"POST",
|
|
1614
|
+
`${this.prefix}/mfa/webauthn/register/finish`,
|
|
1615
|
+
{
|
|
1616
|
+
credential: attestationToJson(cred),
|
|
1617
|
+
friendly_name: params?.friendlyName
|
|
1618
|
+
}
|
|
1619
|
+
);
|
|
1567
1620
|
}
|
|
1568
1621
|
/**
|
|
1569
1622
|
* Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
|
|
@@ -1577,7 +1630,7 @@ var AuthService = class extends core.BaseService {
|
|
|
1577
1630
|
`${this.prefix}/mfa/webauthn/verify/start`,
|
|
1578
1631
|
{ mfa_token: params.mfaToken }
|
|
1579
1632
|
);
|
|
1580
|
-
if (!debut.data) return debut;
|
|
1633
|
+
if (!debut.data) return { data: null, error: debut.error };
|
|
1581
1634
|
let cred;
|
|
1582
1635
|
try {
|
|
1583
1636
|
cred = await conteneur.get(requestOptionsFromJson(debut.data.options));
|
package/dist/index.d.cts
CHANGED
|
@@ -72,12 +72,15 @@ declare class AuthAdminService extends BaseService {
|
|
|
72
72
|
unbanUser(userId: string): Promise<AuraResponse<null>>;
|
|
73
73
|
/**
|
|
74
74
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
75
|
-
* Accepte
|
|
75
|
+
* Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
|
|
76
76
|
*/
|
|
77
77
|
generateLink(userIdOrParams: string | {
|
|
78
78
|
userId?: string;
|
|
79
79
|
user_id?: string;
|
|
80
|
+
email?: string;
|
|
80
81
|
type: GenerateLinkType;
|
|
82
|
+
redirectTo?: string;
|
|
83
|
+
redirect_to?: string;
|
|
81
84
|
}, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
|
|
82
85
|
/**
|
|
83
86
|
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
@@ -573,6 +576,11 @@ declare class AuthService extends BaseService {
|
|
|
573
576
|
}>>;
|
|
574
577
|
};
|
|
575
578
|
};
|
|
579
|
+
/**
|
|
580
|
+
* API d'administration de l'authentification (alias vers `client.authAdmin`).
|
|
581
|
+
* Exige une clé `service_role` (côté serveur uniquement).
|
|
582
|
+
*/
|
|
583
|
+
get admin(): AuthAdminService;
|
|
576
584
|
private webauthnIndisponible;
|
|
577
585
|
/**
|
|
578
586
|
* Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
|
package/dist/index.d.ts
CHANGED
|
@@ -72,12 +72,15 @@ declare class AuthAdminService extends BaseService {
|
|
|
72
72
|
unbanUser(userId: string): Promise<AuraResponse<null>>;
|
|
73
73
|
/**
|
|
74
74
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
75
|
-
* Accepte
|
|
75
|
+
* Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
|
|
76
76
|
*/
|
|
77
77
|
generateLink(userIdOrParams: string | {
|
|
78
78
|
userId?: string;
|
|
79
79
|
user_id?: string;
|
|
80
|
+
email?: string;
|
|
80
81
|
type: GenerateLinkType;
|
|
82
|
+
redirectTo?: string;
|
|
83
|
+
redirect_to?: string;
|
|
81
84
|
}, type?: GenerateLinkType): Promise<AuraResponse<GenerateLinkResult>>;
|
|
82
85
|
/**
|
|
83
86
|
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
@@ -573,6 +576,11 @@ declare class AuthService extends BaseService {
|
|
|
573
576
|
}>>;
|
|
574
577
|
};
|
|
575
578
|
};
|
|
579
|
+
/**
|
|
580
|
+
* API d'administration de l'authentification (alias vers `client.authAdmin`).
|
|
581
|
+
* Exige une clé `service_role` (côté serveur uniquement).
|
|
582
|
+
*/
|
|
583
|
+
get admin(): AuthAdminService;
|
|
576
584
|
private webauthnIndisponible;
|
|
577
585
|
/**
|
|
578
586
|
* Enrôle une passkey WebAuthn pour l'utilisateur connecté (cérémonie complète : options du serveur,
|
package/dist/index.js
CHANGED
|
@@ -50,14 +50,34 @@ var AuthAdminService = class extends BaseService {
|
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Génère un lien à usage unique pour un utilisateur (`'magic'`, `'recovery'` ou `'invite'`) et renvoie `{ link, token }`.
|
|
53
|
-
* Accepte
|
|
53
|
+
* Accepte `generateLink(userId, type)` ou `generateLink({ userId, type })` ou `generateLink({ email, type })`.
|
|
54
54
|
*/
|
|
55
55
|
async generateLink(userIdOrParams, type) {
|
|
56
56
|
let resolvedUserId;
|
|
57
57
|
let resolvedType;
|
|
58
|
+
let resolvedRedirectTo;
|
|
58
59
|
if (typeof userIdOrParams === "object" && userIdOrParams !== null) {
|
|
59
60
|
resolvedUserId = userIdOrParams.userId ?? userIdOrParams.user_id;
|
|
60
61
|
resolvedType = userIdOrParams.type ?? type;
|
|
62
|
+
resolvedRedirectTo = userIdOrParams.redirectTo ?? userIdOrParams.redirect_to;
|
|
63
|
+
if (!resolvedUserId && userIdOrParams.email) {
|
|
64
|
+
const email = userIdOrParams.email.trim().toLowerCase();
|
|
65
|
+
const searchRes = await this.listUsers({ search: email, limit: 1 });
|
|
66
|
+
const usersList = Array.isArray(searchRes.data) ? searchRes.data : [];
|
|
67
|
+
if (usersList[0]?.id) {
|
|
68
|
+
resolvedUserId = usersList[0].id;
|
|
69
|
+
} else {
|
|
70
|
+
return {
|
|
71
|
+
data: null,
|
|
72
|
+
error: new AuraError(404, {
|
|
73
|
+
error: {
|
|
74
|
+
code: "USER_NOT_FOUND",
|
|
75
|
+
message: `No user found with email "${email}".`
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
61
81
|
} else if (typeof userIdOrParams === "string") {
|
|
62
82
|
resolvedUserId = userIdOrParams;
|
|
63
83
|
resolvedType = type;
|
|
@@ -68,7 +88,7 @@ var AuthAdminService = class extends BaseService {
|
|
|
68
88
|
error: new AuraError(400, {
|
|
69
89
|
error: {
|
|
70
90
|
code: "INVALID_ARGUMENT",
|
|
71
|
-
message: "userId
|
|
91
|
+
message: "userId or email is required. Usage: generateLink({ email, type }) or generateLink(userId, type)."
|
|
72
92
|
}
|
|
73
93
|
})
|
|
74
94
|
};
|
|
@@ -84,7 +104,15 @@ var AuthAdminService = class extends BaseService {
|
|
|
84
104
|
})
|
|
85
105
|
};
|
|
86
106
|
}
|
|
87
|
-
|
|
107
|
+
const body = { type: resolvedType };
|
|
108
|
+
if (resolvedRedirectTo) {
|
|
109
|
+
body.redirect_to = resolvedRedirectTo;
|
|
110
|
+
}
|
|
111
|
+
return this.request(
|
|
112
|
+
"POST",
|
|
113
|
+
`${this.prefix}/users/${encodeURIComponent(resolvedUserId)}/generate-link`,
|
|
114
|
+
body
|
|
115
|
+
);
|
|
88
116
|
}
|
|
89
117
|
/**
|
|
90
118
|
* Impersonation (AUTH-037) : jeton COURT (10 minutes au plus) pour agir en tant que l'utilisateur,
|
|
@@ -1505,14 +1533,28 @@ var AuthService = class extends BaseService {
|
|
|
1505
1533
|
const code = typeof codeOrParams === "string" ? codeOrParams : codeOrParams.code;
|
|
1506
1534
|
return this.regenerateRecoveryCodes(code);
|
|
1507
1535
|
},
|
|
1508
|
-
factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
|
|
1536
|
+
factors: (mfaToken) => this.request("POST", `${this.prefix}/mfa/factors`, {
|
|
1537
|
+
mfa_token: mfaToken
|
|
1538
|
+
}),
|
|
1509
1539
|
sms: {
|
|
1510
1540
|
setup: (phone) => this.request("POST", `${this.prefix}/mfa/sms/setup`, { phone }),
|
|
1511
|
-
verifySetup: (code) => this.request(
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1541
|
+
verifySetup: (code) => this.request(
|
|
1542
|
+
"POST",
|
|
1543
|
+
`${this.prefix}/mfa/sms/setup/verify`,
|
|
1544
|
+
{ code }
|
|
1545
|
+
),
|
|
1546
|
+
send: (mfaToken) => this.request(
|
|
1547
|
+
"POST",
|
|
1548
|
+
`${this.prefix}/mfa/sms/send`,
|
|
1549
|
+
{
|
|
1550
|
+
mfa_token: mfaToken
|
|
1551
|
+
}
|
|
1552
|
+
),
|
|
1553
|
+
remove: (password) => this.request(
|
|
1554
|
+
"DELETE",
|
|
1555
|
+
`${this.prefix}/mfa/sms`,
|
|
1556
|
+
{ password }
|
|
1557
|
+
)
|
|
1516
1558
|
},
|
|
1517
1559
|
webauthn: {
|
|
1518
1560
|
register: (params) => this.webauthnRegister(params),
|
|
@@ -1526,6 +1568,13 @@ var AuthService = class extends BaseService {
|
|
|
1526
1568
|
}
|
|
1527
1569
|
};
|
|
1528
1570
|
}
|
|
1571
|
+
/**
|
|
1572
|
+
* API d'administration de l'authentification (alias vers `client.authAdmin`).
|
|
1573
|
+
* Exige une clé `service_role` (côté serveur uniquement).
|
|
1574
|
+
*/
|
|
1575
|
+
get admin() {
|
|
1576
|
+
return this.client.authAdmin;
|
|
1577
|
+
}
|
|
1529
1578
|
webauthnIndisponible() {
|
|
1530
1579
|
return {
|
|
1531
1580
|
data: null,
|
|
@@ -1550,7 +1599,7 @@ var AuthService = class extends BaseService {
|
|
|
1550
1599
|
`${this.prefix}/mfa/webauthn/register/start`,
|
|
1551
1600
|
{ friendly_name: params?.friendlyName }
|
|
1552
1601
|
);
|
|
1553
|
-
if (!debut.data) return debut;
|
|
1602
|
+
if (!debut.data) return { data: null, error: debut.error };
|
|
1554
1603
|
let cred;
|
|
1555
1604
|
try {
|
|
1556
1605
|
cred = await conteneur.create(creationOptionsFromJson(debut.data.options));
|
|
@@ -1558,10 +1607,14 @@ var AuthService = class extends BaseService {
|
|
|
1558
1607
|
return this.webauthnAnnule(e);
|
|
1559
1608
|
}
|
|
1560
1609
|
if (!cred) return this.webauthnAnnule(new Error("no credential returned"));
|
|
1561
|
-
return this.request(
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1610
|
+
return this.request(
|
|
1611
|
+
"POST",
|
|
1612
|
+
`${this.prefix}/mfa/webauthn/register/finish`,
|
|
1613
|
+
{
|
|
1614
|
+
credential: attestationToJson(cred),
|
|
1615
|
+
friendly_name: params?.friendlyName
|
|
1616
|
+
}
|
|
1617
|
+
);
|
|
1565
1618
|
}
|
|
1566
1619
|
/**
|
|
1567
1620
|
* Relève un défi MFA (`mfaToken`, reçu d'un `signIn`) avec une passkey : options du serveur,
|
|
@@ -1575,7 +1628,7 @@ var AuthService = class extends BaseService {
|
|
|
1575
1628
|
`${this.prefix}/mfa/webauthn/verify/start`,
|
|
1576
1629
|
{ mfa_token: params.mfaToken }
|
|
1577
1630
|
);
|
|
1578
|
-
if (!debut.data) return debut;
|
|
1631
|
+
if (!debut.data) return { data: null, error: debut.error };
|
|
1579
1632
|
let cred;
|
|
1580
1633
|
try {
|
|
1581
1634
|
cred = await conteneur.get(requestOptionsFromJson(debut.data.options));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aurabase/auth",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.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",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"authentication"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@aurabase/core": "0.7.
|
|
49
|
+
"@aurabase/core": "0.7.2"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "20.14.15",
|