aaspai-authx 0.1.1 → 0.1.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/dist/express/index.cjs +97 -16
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.js +97 -16
- package/dist/express/index.js.map +1 -1
- package/dist/index.cjs +97 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +71 -70
- package/dist/index.d.ts +71 -70
- package/dist/index.js +97 -16
- package/dist/index.js.map +1 -1
- package/dist/nest/index.cjs +97 -16
- package/dist/nest/index.cjs.map +1 -1
- package/dist/nest/index.js +97 -16
- package/dist/nest/index.js.map +1 -1
- package/package.json +2 -2
package/dist/nest/index.cjs
CHANGED
|
@@ -178,10 +178,14 @@ function buildSession(payload) {
|
|
|
178
178
|
roles: normalizedRoles,
|
|
179
179
|
permissions
|
|
180
180
|
};
|
|
181
|
+
if (payload?.firstName) session.firstName = payload.firstName;
|
|
182
|
+
if (payload?.lastName) session.lastName = payload.lastName;
|
|
181
183
|
if (payload?.projectId) session.projectId = payload.projectId;
|
|
182
184
|
if (payload?.orgId) session.orgId = payload.orgId;
|
|
183
185
|
if (payload?.org_id) session.org_id = payload.org_id;
|
|
184
186
|
if (payload?.authType) session.authType = payload.authType;
|
|
187
|
+
if (payload?.createdAt) session.createdAt = payload.createdAt;
|
|
188
|
+
if (payload?.metadata) session.metadata = payload.metadata;
|
|
185
189
|
Object.keys(payload || {}).forEach((key) => {
|
|
186
190
|
if (![
|
|
187
191
|
"sub",
|
|
@@ -355,10 +359,14 @@ function requireAuth() {
|
|
|
355
359
|
const session = buildSession({
|
|
356
360
|
sub: user.id.toString(),
|
|
357
361
|
email: user.email,
|
|
362
|
+
firstName: user.firstName,
|
|
363
|
+
lastName: user.lastName,
|
|
364
|
+
metadata: user.metadata || [],
|
|
358
365
|
roles: user.roles || [],
|
|
359
366
|
orgId: user.orgId,
|
|
360
367
|
org_id: user.orgId,
|
|
361
|
-
projectId: user.projectId
|
|
368
|
+
projectId: user.projectId,
|
|
369
|
+
createdAt: user.createdAt
|
|
362
370
|
});
|
|
363
371
|
session.authType = "api-key";
|
|
364
372
|
session.projectId = readProjectId(req) || user.projectId || void 0;
|
|
@@ -455,7 +463,6 @@ var Invite = import_mongoose3.default.model("Invite", InviteSchema);
|
|
|
455
463
|
// src/services/auth-admin.service.ts
|
|
456
464
|
var import_bcrypt = __toESM(require("bcrypt"), 1);
|
|
457
465
|
var import_jsonwebtoken2 = __toESM(require("jsonwebtoken"), 1);
|
|
458
|
-
var import_uuid2 = require("uuid");
|
|
459
466
|
|
|
460
467
|
// src/models/client.model.ts
|
|
461
468
|
var import_mongoose4 = __toESM(require("mongoose"), 1);
|
|
@@ -525,7 +532,7 @@ var AuthAdminService = class {
|
|
|
525
532
|
async createUserInRealm(payload) {
|
|
526
533
|
const hashedPassword = payload.credentials?.[0]?.value ? await import_bcrypt.default.hash(payload.credentials[0].value, 10) : void 0;
|
|
527
534
|
const user = await OrgUser.create({
|
|
528
|
-
id:
|
|
535
|
+
id: crypto.randomUUID(),
|
|
529
536
|
email: payload.email,
|
|
530
537
|
firstName: payload.firstName,
|
|
531
538
|
lastName: payload.lastName,
|
|
@@ -589,24 +596,61 @@ var EmailService = class {
|
|
|
589
596
|
host: process.env.EMAIL_HOST || "smtp.postmarkapp.com",
|
|
590
597
|
port: process.env.EMAIL_PORT ? Number(process.env.EMAIL_PORT) : 587,
|
|
591
598
|
secure: (process.env.EMAIL_SECURE || "false") === "true",
|
|
592
|
-
auth: {
|
|
599
|
+
auth: {
|
|
600
|
+
user: process.env.EMAIL_USER,
|
|
601
|
+
pass: process.env.EMAIL_PASSWORD
|
|
602
|
+
}
|
|
593
603
|
});
|
|
594
604
|
}
|
|
595
605
|
sign(payload, ttlSec = 60 * 60 * 24) {
|
|
596
|
-
return import_jsonwebtoken3.default.sign(payload, process.env.EMAIL_JWT_SECRET, {
|
|
606
|
+
return import_jsonwebtoken3.default.sign(payload, process.env.EMAIL_JWT_SECRET, {
|
|
607
|
+
expiresIn: ttlSec
|
|
608
|
+
});
|
|
597
609
|
}
|
|
598
610
|
verify(token) {
|
|
599
611
|
return import_jsonwebtoken3.default.verify(token, process.env.EMAIL_JWT_SECRET);
|
|
600
612
|
}
|
|
601
613
|
async send(to, subject, html) {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
614
|
+
console.log("[EmailService] Attempting to send:", { to, subject });
|
|
615
|
+
try {
|
|
616
|
+
const info = await this.transporter.sendMail({
|
|
617
|
+
from: process.env.EMAIL_FROM,
|
|
618
|
+
to,
|
|
619
|
+
subject,
|
|
620
|
+
html
|
|
621
|
+
});
|
|
622
|
+
console.log("[EmailService] \u2705 Email sent successfully:", {
|
|
623
|
+
messageId: info.messageId,
|
|
624
|
+
response: info.response,
|
|
625
|
+
accepted: info.accepted,
|
|
626
|
+
rejected: info.rejected
|
|
627
|
+
});
|
|
628
|
+
return info;
|
|
629
|
+
} catch (error) {
|
|
630
|
+
console.error("[EmailService] \u274C Failed to send email:", {
|
|
631
|
+
message: error.message,
|
|
632
|
+
code: error.code,
|
|
633
|
+
command: error.command,
|
|
634
|
+
responseCode: error.responseCode,
|
|
635
|
+
response: error.response,
|
|
636
|
+
stack: error.stack
|
|
637
|
+
});
|
|
638
|
+
throw error;
|
|
639
|
+
}
|
|
608
640
|
}
|
|
609
641
|
canSend(lastEmailSent) {
|
|
642
|
+
console.log(
|
|
643
|
+
process.env.EMAIL_PASSWORD,
|
|
644
|
+
"pssword",
|
|
645
|
+
process.env.EMAIL_USER,
|
|
646
|
+
"user",
|
|
647
|
+
process.env.EMAIL_SECURE,
|
|
648
|
+
"secure",
|
|
649
|
+
process.env.EMAIL_PORT,
|
|
650
|
+
"porat",
|
|
651
|
+
process.env.EMAIL_HOST,
|
|
652
|
+
"hosat"
|
|
653
|
+
);
|
|
610
654
|
const now = Date.now();
|
|
611
655
|
const windowStart = now - this.WINDOW_MINUTES * 60 * 1e3;
|
|
612
656
|
const emailsInWindow = (lastEmailSent || []).map((d) => new Date(d)).filter((d) => d.getTime() >= windowStart);
|
|
@@ -998,7 +1042,11 @@ function createAuthRouter(options = {}) {
|
|
|
998
1042
|
if (!isGoogleEnabled) {
|
|
999
1043
|
return res.status(500).json({ error: "Google login not configured" });
|
|
1000
1044
|
}
|
|
1001
|
-
const
|
|
1045
|
+
const stateData = {
|
|
1046
|
+
redirectTo: req.query.redirectTo || "",
|
|
1047
|
+
projectId: req.query.projectId || process.env.DEFAULT_PROJECT_ID || ""
|
|
1048
|
+
};
|
|
1049
|
+
const state = encodeURIComponent(JSON.stringify(stateData));
|
|
1002
1050
|
const params = new URLSearchParams({
|
|
1003
1051
|
client_id: googleClientId,
|
|
1004
1052
|
redirect_uri: googleRedirectUri,
|
|
@@ -1009,6 +1057,7 @@ function createAuthRouter(options = {}) {
|
|
|
1009
1057
|
state
|
|
1010
1058
|
});
|
|
1011
1059
|
const url = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;
|
|
1060
|
+
console.log(url, "url");
|
|
1012
1061
|
res.redirect(url);
|
|
1013
1062
|
});
|
|
1014
1063
|
r.get("/google/callback", async (req, res) => {
|
|
@@ -1016,7 +1065,21 @@ function createAuthRouter(options = {}) {
|
|
|
1016
1065
|
return res.status(500).json({ error: "Google login not configured" });
|
|
1017
1066
|
}
|
|
1018
1067
|
const code = String(req.query.code || "");
|
|
1019
|
-
|
|
1068
|
+
let stateData = { redirectTo: "", projectId: "" };
|
|
1069
|
+
try {
|
|
1070
|
+
if (req.query.state) {
|
|
1071
|
+
stateData = JSON.parse(decodeURIComponent(String(req.query.state)));
|
|
1072
|
+
}
|
|
1073
|
+
} catch (err) {
|
|
1074
|
+
console.error("Failed to parse state:", err);
|
|
1075
|
+
}
|
|
1076
|
+
const { redirectTo, projectId } = stateData;
|
|
1077
|
+
console.log(
|
|
1078
|
+
"Parsed state - redirectTo:",
|
|
1079
|
+
redirectTo,
|
|
1080
|
+
"projectId:",
|
|
1081
|
+
projectId
|
|
1082
|
+
);
|
|
1020
1083
|
if (!code) {
|
|
1021
1084
|
return res.status(400).json({ ok: false, error: "Missing authorization code" });
|
|
1022
1085
|
}
|
|
@@ -1051,13 +1114,19 @@ function createAuthRouter(options = {}) {
|
|
|
1051
1114
|
const lastName = decoded.family_name || "";
|
|
1052
1115
|
let user = await OrgUser.findOne({ email: email2 }).lean();
|
|
1053
1116
|
if (!user) {
|
|
1117
|
+
const finalProjectId = projectId || process.env.DEFAULT_PROJECT_ID;
|
|
1118
|
+
if (!finalProjectId) {
|
|
1119
|
+
console.error("No projectId available for new user");
|
|
1120
|
+
const errorRedirect = (redirectTo || googleDefaultRedirect) + (redirectTo?.includes("?") ? "&" : "?") + "error=missing_project_id";
|
|
1121
|
+
return res.redirect(errorRedirect);
|
|
1122
|
+
}
|
|
1054
1123
|
const created = await OrgUser.create({
|
|
1055
1124
|
email: email2,
|
|
1056
1125
|
firstName,
|
|
1057
1126
|
lastName,
|
|
1058
1127
|
emailVerified,
|
|
1059
1128
|
roles: ["platform_user"],
|
|
1060
|
-
projectId:
|
|
1129
|
+
projectId: finalProjectId,
|
|
1061
1130
|
metadata: []
|
|
1062
1131
|
// you can also store googleId: decoded.sub
|
|
1063
1132
|
});
|
|
@@ -1065,8 +1134,14 @@ function createAuthRouter(options = {}) {
|
|
|
1065
1134
|
}
|
|
1066
1135
|
const tokens = generateTokens(user);
|
|
1067
1136
|
setAuthCookies(res, tokens, cookieConfig);
|
|
1068
|
-
|
|
1069
|
-
|
|
1137
|
+
if (user.projectId) {
|
|
1138
|
+
res.cookie(options.projectCookieName || "projectId", user.projectId, {
|
|
1139
|
+
...baseProjectCookieOptionsFrom(cookieConfig),
|
|
1140
|
+
httpOnly: true
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
1143
|
+
const finalRedirect = redirectTo || googleDefaultRedirect;
|
|
1144
|
+
res.redirect(finalRedirect);
|
|
1070
1145
|
} catch (err) {
|
|
1071
1146
|
console.error("Google callback error", err);
|
|
1072
1147
|
const redirectError = googleDefaultRedirect.includes("?") ? `${googleDefaultRedirect}&error=google_login_failed` : `${googleDefaultRedirect}?error=google_login_failed`;
|
|
@@ -1238,6 +1313,7 @@ async function sendRateLimitedEmail({
|
|
|
1238
1313
|
if (!can.ok) {
|
|
1239
1314
|
return { rateLimited: true, waitMs: can.waitMs };
|
|
1240
1315
|
}
|
|
1316
|
+
console.log(can, "can");
|
|
1241
1317
|
await emailService.send(user.email, subject, html);
|
|
1242
1318
|
user.lastEmailSent = [...user.lastEmailSent || [], /* @__PURE__ */ new Date()];
|
|
1243
1319
|
await user.save();
|
|
@@ -1251,6 +1327,11 @@ function generateTokens(user) {
|
|
|
1251
1327
|
orgId: user.orgId || null,
|
|
1252
1328
|
org_id: user.orgId || null,
|
|
1253
1329
|
projectId: user.projectId || null,
|
|
1330
|
+
firstName: user.firstName,
|
|
1331
|
+
lastName: user.lastName,
|
|
1332
|
+
emailVerified: user.emailVerified,
|
|
1333
|
+
createdAt: user.createdAt,
|
|
1334
|
+
metadata: user.metadata,
|
|
1254
1335
|
type: "user"
|
|
1255
1336
|
};
|
|
1256
1337
|
const accessToken = import_jsonwebtoken4.default.sign(accessPayload, process.env.JWT_SECRET, {
|