59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import { Elysia, t } from "elysia";
|
|
import { ip } from "elysia-ip";
|
|
import { verifyUser, createSession, getSessionExpirationDate } from "@elysia/lib/auth";
|
|
|
|
export const loginHandler = new Elysia({ prefix: "/auth" })
|
|
.use(ip())
|
|
.post(
|
|
"/session",
|
|
async ({ body, set, cookie, ip, request }) => {
|
|
const { username, password } = body;
|
|
|
|
const user = await verifyUser(username, password);
|
|
if (!user) {
|
|
set.status = 401;
|
|
return { message: "Invalid credentials." };
|
|
}
|
|
|
|
const userAgent = request.headers.get("user-agent") || "Unknown";
|
|
const sessionId = await createSession(user.id, ip || null, userAgent);
|
|
|
|
const expiresAt = getSessionExpirationDate();
|
|
cookie.sessionId.value = sessionId;
|
|
cookie.sessionId.httpOnly = true;
|
|
cookie.sessionId.secure = process.env.NODE_ENV === 'production';
|
|
cookie.sessionId.sameSite = 'strict';
|
|
cookie.sessionId.expires = expiresAt;
|
|
|
|
return {
|
|
message: "You are logged in.",
|
|
user: {
|
|
id: user.id,
|
|
username: user.username,
|
|
nickname: user.nickname,
|
|
role: user.role
|
|
}
|
|
};
|
|
},
|
|
{
|
|
response: {
|
|
200: t.Object({
|
|
message: t.String(),
|
|
user: t.Object({
|
|
id: t.Integer(),
|
|
username: t.String(),
|
|
nickname: t.Optional(t.String()),
|
|
role: t.String()
|
|
})
|
|
}),
|
|
401: t.Object({
|
|
message: t.String()
|
|
})
|
|
},
|
|
body: t.Object({
|
|
username: t.String(),
|
|
password: t.String()
|
|
})
|
|
}
|
|
)
|
|
|