@reverso/api 0.1.16 → 0.1.17
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/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +102 -83
- package/dist/routes/auth.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAyC7E,wBAA8B,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAyC7E,wBAA8B,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuThF"}
|
package/dist/routes/auth.js
CHANGED
|
@@ -28,96 +28,115 @@ export default async function authRoutes(fastify) {
|
|
|
28
28
|
* POST /auth/login - Login with email and password.
|
|
29
29
|
*/
|
|
30
30
|
fastify.post('/auth/login', async (request, reply) => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
try {
|
|
32
|
+
const db = request.db;
|
|
33
|
+
if (!db) {
|
|
34
|
+
console.error('[AUTH] Database not available on request');
|
|
35
|
+
return reply.status(500).send({
|
|
36
|
+
success: false,
|
|
37
|
+
error: 'Database not available',
|
|
38
|
+
message: 'Internal server error - database connection failed',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const ip = request.ip;
|
|
42
|
+
// Check lockout (persistent in database)
|
|
43
|
+
const lockoutKey = `login:${ip}`;
|
|
44
|
+
const lockoutStatus = await isLockedOut(db, lockoutKey);
|
|
45
|
+
if (lockoutStatus.locked) {
|
|
46
|
+
return reply.status(429).send({
|
|
47
|
+
success: false,
|
|
48
|
+
error: 'Too many failed attempts',
|
|
49
|
+
message: `Account temporarily locked. Try again in ${Math.ceil(lockoutStatus.remainingSeconds / 60)} minutes.`,
|
|
50
|
+
retryAfter: lockoutStatus.remainingSeconds,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Validate input
|
|
54
|
+
const parseResult = loginSchema.safeParse(request.body);
|
|
55
|
+
if (!parseResult.success) {
|
|
56
|
+
return reply.status(400).send({
|
|
57
|
+
success: false,
|
|
58
|
+
error: 'Validation error',
|
|
59
|
+
details: parseResult.error.issues,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const { email, password } = parseResult.data;
|
|
63
|
+
// Find user
|
|
64
|
+
const user = await getUserByEmail(db, email);
|
|
65
|
+
if (!user) {
|
|
66
|
+
await recordFailedLoginAttempt(db, lockoutKey);
|
|
67
|
+
return reply.status(401).send({
|
|
68
|
+
success: false,
|
|
69
|
+
error: 'Invalid credentials',
|
|
70
|
+
message: 'Email or password is incorrect',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Get account with password
|
|
74
|
+
const account = await getAccountByUserId(db, user.id, 'credential');
|
|
75
|
+
if (!account || !account.password) {
|
|
76
|
+
await recordFailedLoginAttempt(db, lockoutKey);
|
|
77
|
+
return reply.status(401).send({
|
|
78
|
+
success: false,
|
|
79
|
+
error: 'Invalid credentials',
|
|
80
|
+
message: 'Email or password is incorrect',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// Verify password
|
|
84
|
+
const passwordValid = await bcrypt.compare(password, account.password);
|
|
85
|
+
if (!passwordValid) {
|
|
86
|
+
await recordFailedLoginAttempt(db, lockoutKey);
|
|
87
|
+
return reply.status(401).send({
|
|
88
|
+
success: false,
|
|
89
|
+
error: 'Invalid credentials',
|
|
90
|
+
message: 'Email or password is incorrect',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Clear failed attempts on successful login
|
|
94
|
+
await clearLoginAttempts(db, lockoutKey);
|
|
95
|
+
// Create session
|
|
96
|
+
const token = generateSessionToken();
|
|
97
|
+
const expiresAt = new Date(Date.now() + SESSION_DURATION_DAYS * 24 * 60 * 60 * 1000);
|
|
98
|
+
const session = await createSession(db, {
|
|
99
|
+
id: crypto.randomUUID(),
|
|
100
|
+
userId: user.id,
|
|
101
|
+
token,
|
|
102
|
+
expiresAt,
|
|
103
|
+
ipAddress: ip,
|
|
104
|
+
userAgent: request.headers['user-agent'] ?? null,
|
|
105
|
+
createdAt: new Date(),
|
|
106
|
+
updatedAt: new Date(),
|
|
42
107
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
details: parseResult.error.issues,
|
|
108
|
+
// Set cookie
|
|
109
|
+
reply.setCookie('reverso_session', token, {
|
|
110
|
+
httpOnly: true,
|
|
111
|
+
secure: process.env.NODE_ENV === 'production',
|
|
112
|
+
sameSite: 'lax',
|
|
113
|
+
path: '/',
|
|
114
|
+
expires: expiresAt,
|
|
51
115
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const account = await getAccountByUserId(db, user.id, 'credential');
|
|
66
|
-
if (!account || !account.password) {
|
|
67
|
-
await recordFailedLoginAttempt(db, lockoutKey);
|
|
68
|
-
return reply.status(401).send({
|
|
69
|
-
success: false,
|
|
70
|
-
error: 'Invalid credentials',
|
|
71
|
-
message: 'Email or password is incorrect',
|
|
116
|
+
return reply.send({
|
|
117
|
+
success: true,
|
|
118
|
+
user: {
|
|
119
|
+
id: user.id,
|
|
120
|
+
email: user.email,
|
|
121
|
+
name: user.name,
|
|
122
|
+
role: user.role,
|
|
123
|
+
image: user.image,
|
|
124
|
+
},
|
|
125
|
+
session: {
|
|
126
|
+
token,
|
|
127
|
+
expiresAt: session.expiresAt.toISOString(),
|
|
128
|
+
},
|
|
72
129
|
});
|
|
73
130
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
await recordFailedLoginAttempt(db, lockoutKey);
|
|
78
|
-
return reply.status(401).send({
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('[AUTH LOGIN ERROR]', error);
|
|
133
|
+
return reply.status(500).send({
|
|
79
134
|
success: false,
|
|
80
|
-
error: '
|
|
81
|
-
message:
|
|
135
|
+
error: 'Internal server error',
|
|
136
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
137
|
+
stack: process.env.NODE_ENV !== 'production' && error instanceof Error ? error.stack : undefined,
|
|
82
138
|
});
|
|
83
139
|
}
|
|
84
|
-
// Clear failed attempts on successful login
|
|
85
|
-
await clearLoginAttempts(db, lockoutKey);
|
|
86
|
-
// Create session
|
|
87
|
-
const token = generateSessionToken();
|
|
88
|
-
const expiresAt = new Date(Date.now() + SESSION_DURATION_DAYS * 24 * 60 * 60 * 1000);
|
|
89
|
-
const session = await createSession(db, {
|
|
90
|
-
id: crypto.randomUUID(),
|
|
91
|
-
userId: user.id,
|
|
92
|
-
token,
|
|
93
|
-
expiresAt,
|
|
94
|
-
ipAddress: ip,
|
|
95
|
-
userAgent: request.headers['user-agent'] ?? null,
|
|
96
|
-
createdAt: new Date(),
|
|
97
|
-
updatedAt: new Date(),
|
|
98
|
-
});
|
|
99
|
-
// Set cookie
|
|
100
|
-
reply.setCookie('reverso_session', token, {
|
|
101
|
-
httpOnly: true,
|
|
102
|
-
secure: process.env.NODE_ENV === 'production',
|
|
103
|
-
sameSite: 'lax',
|
|
104
|
-
path: '/',
|
|
105
|
-
expires: expiresAt,
|
|
106
|
-
});
|
|
107
|
-
return reply.send({
|
|
108
|
-
success: true,
|
|
109
|
-
user: {
|
|
110
|
-
id: user.id,
|
|
111
|
-
email: user.email,
|
|
112
|
-
name: user.name,
|
|
113
|
-
role: user.role,
|
|
114
|
-
image: user.image,
|
|
115
|
-
},
|
|
116
|
-
session: {
|
|
117
|
-
token,
|
|
118
|
-
expiresAt: session.expiresAt.toISOString(),
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
140
|
});
|
|
122
141
|
/**
|
|
123
142
|
* POST /auth/logout - Logout and invalidate session.
|
package/dist/routes/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,wBAAwB,EACxB,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;GAEG;AACH,SAAS,oBAAoB;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,qBAAqB;AACrB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC;IAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wCAAwC,CAAC;IACrE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,UAAU,CAAC,OAAwB;IAC/D;;OAEG;IACH,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACjF,MAAM,EAAE,GAAI,OAA8C,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"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"}
|