73 lines
2.4 KiB
JavaScript
73 lines
2.4 KiB
JavaScript
import { NextRequest, NextResponse } from "next/server"
|
|
import { refreshAccessToken } from "./utils/auth"
|
|
import { jwtVerify } from "jose"
|
|
const secretKey = new TextEncoder().encode("Swe4g7c?UBm5Nrd96vhsVDtkyJFbqKMTm!TMw5BDRLtaCFAXNvbq?s4rGKQSZnUP")
|
|
|
|
const verifyJWT = async (token) => {
|
|
const { payload, protectedHeader } = await jwtVerify(token, secretKey)
|
|
return payload
|
|
}
|
|
|
|
export default async function middleware(req, res) {
|
|
// Extract token from request headers or cookies or wherever it's stored
|
|
const token = req.cookies.get("token")
|
|
|
|
if (!token || token.value == "") {
|
|
if (req.url == "http://localhost:3000/login") {
|
|
} else {
|
|
return NextResponse.redirect(new URL("/login", req.url))
|
|
}
|
|
} else {
|
|
if (req.url == "http://localhost:3000/login") {
|
|
return NextResponse.redirect("http://localhost:3000/home")
|
|
}
|
|
}
|
|
|
|
try {
|
|
// Verify the token
|
|
console.log("ASdasdasssssssssssss")
|
|
console.log(token.value)
|
|
const payload = await verifyJWT(token.value)
|
|
|
|
// Attach the decoded user object to the request
|
|
// req.user = decoded.user;
|
|
// return NextResponse.redirect(new URL( req.url, '/home'))
|
|
// Validate if the user is the one that is present in cookie
|
|
} catch (error) {
|
|
if (error.name === "JWTExpired") {
|
|
console.log(error)
|
|
//delete the token from cookie
|
|
console.log("deleting the token")
|
|
//renew the token
|
|
// console.log(req.cookies.get('rtoken'));
|
|
|
|
const rtoken = req.cookies.get("rtoken")
|
|
if (rtoken == undefined) {
|
|
console.log("undefined")
|
|
}
|
|
console.log("defined")
|
|
|
|
const newtoken = await refreshAccessToken(rtoken)
|
|
if (newtoken == undefined) {
|
|
const res = NextResponse.redirect(new URL("/login", req.url)) // creates an actual instance
|
|
res.cookies.set("token", newtoken)
|
|
return res
|
|
}
|
|
console.log("defined")
|
|
const res = NextResponse.next() // creates an actual instance
|
|
res.cookies.set("token", newtoken)
|
|
return res
|
|
}
|
|
console.log(error)
|
|
// Handle other JWT errors
|
|
// return Response.json({ message: 'Unauthorized' }, { status: 401 });
|
|
|
|
// const res = NextResponse.redirect(new URL( '/login',req.url)) // creates an actual instance
|
|
// res.cookies.delete('token') // can be called on an instance
|
|
// return res
|
|
}
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
|
|
}
|