@lucia-auth/nextjs
Version:
Lucia integration for Next.js
81 lines (80 loc) • 2.6 kB
JavaScript
import { convertNextRequestToStandardRequest } from "./request.js";
export const handleApiRoutes = (auth) => {
return async (req, res) => {
if (!res.status)
throw new Error("Invalid response type");
const authRequest = new AuthRequest(auth, req, res);
if ((req.url ?? "").startsWith("/api/auth/user") && req.method === "GET") {
const { user } = await authRequest.validateUser();
return res.status(200).json({
user
});
}
if ((req.url ?? "").startsWith("/api/auth/logout") &&
req.method === "POST") {
const sessionId = auth.validateRequestHeaders(convertNextRequestToStandardRequest(req));
if (!sessionId)
return res.status(200).json({});
try {
await auth.invalidateSession(sessionId);
authRequest.setSession(null);
return res.status(200).json({});
}
catch {
return res.status(500).json({
message: "unknown"
});
}
}
return res.status(404).json({
message: "not found"
});
};
};
export class AuthRequest {
auth;
req;
res;
constructor(auth, req, res) {
this.auth = auth;
this.req = req;
this.res = res;
}
validate = async () => {
try {
const sessionId = this.auth.validateRequestHeaders(convertNextRequestToStandardRequest(this.req));
const session = await this.auth.validateSession(sessionId);
if (session.isFresh) {
this.setSession(session);
}
return session;
}
catch (e) {
this.setSession(null);
return null;
}
};
validateUser = async () => {
try {
const sessionId = this.auth.validateRequestHeaders(convertNextRequestToStandardRequest(this.req));
const { session, user } = await this.auth.validateSessionUser(sessionId);
if (session.isFresh) {
this.setSession(session);
}
return { session, user };
}
catch (e) {
this.setSession(null);
return {
session: null,
user: null
};
}
};
setSession = (session) => {
this.res.setHeader("set-cookie", this.auth
.createSessionCookies(session)
.map((cookie) => cookie.serialize())
.toString());
};
}