✨ 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
	 sam
						sam