✨ 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