✨ login and register
This commit is contained in:
parent
8ee42ea0ac
commit
753abe7607
19
middleware.ts
Normal file
19
middleware.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
import jwt from "jsonwebtoken";
|
||||
|
||||
const SECRET_KEY = process.env.JWT_SECRET as string;
|
||||
|
||||
export function middleware(req: NextRequest) {
|
||||
const token = req.cookies.get("token")?.value;
|
||||
|
||||
if (!token) return NextResponse.redirect(new URL("/login", req.url));
|
||||
|
||||
try {
|
||||
jwt.verify(token, SECRET_KEY);
|
||||
return NextResponse.next();
|
||||
} catch (error) {
|
||||
return NextResponse.redirect(new URL("/login", req.url));
|
||||
}
|
||||
}
|
||||
|
||||
export const config = { matcher: ["/dashboard", "/profile"] };
|
27
pages/api/auth/me.ts
Normal file
27
pages/api/auth/me.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import jwt from "jsonwebtoken";
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
const SECRET_KEY = process.env.JWT_SECRET as string;
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
const authHeader = req.headers.authorization;
|
||||
|
||||
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
||||
return res.status(401).json({ message: "Unauthorized" });
|
||||
}
|
||||
|
||||
const token = authHeader.split(" ")[1]; // Extract token
|
||||
|
||||
try {
|
||||
const decoded: any = jwt.verify(token, SECRET_KEY);
|
||||
const user = await prisma.user.findUnique({ where: { id: decoded.userId } });
|
||||
|
||||
if (!user) return res.status(401).json({ message: "User not found" });
|
||||
|
||||
res.json({ user });
|
||||
} catch (error) {
|
||||
res.status(401).json({ message: "Invalid token" });
|
||||
}
|
||||
}
|
24
pages/api/login.ts
Normal file
24
pages/api/login.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
import bcrypt from "bcrypt";
|
||||
import jwt from "jsonwebtoken";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
const SECRET_KEY = process.env.JWT_SECRET as string;
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
if (req.method !== "POST") return res.status(405).json({ message: "Method not allowed" });
|
||||
|
||||
const { email, password } = req.body;
|
||||
|
||||
const user = await prisma.user.findUnique({ where: { email } });
|
||||
if (!user) return res.status(401).json({ message: "Invalid credentials" });
|
||||
|
||||
const isMatch = await bcrypt.compare(password, user.password);
|
||||
if (!isMatch) return res.status(401).json({ message: "Invalid credentials" });
|
||||
|
||||
const token = jwt.sign({ userId: user.id, email: user.email }, SECRET_KEY, { expiresIn: "1h" });
|
||||
|
||||
res.setHeader("Set-Cookie", `token=${token}; HttpOnly; Path=/; Secure`);
|
||||
res.json({ token });
|
||||
}
|
21
pages/api/register.ts
Normal file
21
pages/api/register.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
import bcrypt from "bcrypt";
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
||||
if (req.method !== "POST") return res.status(405).json({ message: "Method not allowed" });
|
||||
|
||||
const { email, password } = req.body;
|
||||
|
||||
const existingUser = await prisma.user.findUnique({ where: { email } });
|
||||
if (existingUser) return res.status(400).json({ message: "User already exists" });
|
||||
|
||||
const hashedPassword = await bcrypt.hash(password, 10);
|
||||
const user = await prisma.user.create({
|
||||
data: { email, password: hashedPassword },
|
||||
});
|
||||
|
||||
res.status(201).json({ message: "User registered", user });
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user