next-enterprise/middleware.js

74 lines
2.4 KiB
JavaScript
Raw Normal View History

2024-02-29 09:33:34 +01:00
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).*)"],
}