feat: Improve session handling and cookie management in API
- Enhanced the GET request handler to better manage session tokens from both request headers and Next.js cookie store. - Added detailed error handling for authentication failures and improved logging for debugging purposes. - Updated cookie management to provide clearer insights into session token presence and accessibility. - Ensured secure cookie handling is enforced in production environments.
This commit is contained in:
parent
ea7da85d5e
commit
9457f08580
@ -4,11 +4,9 @@ import { cookies } from "next/headers"
|
|||||||
|
|
||||||
export async function GET(request: Request) {
|
export async function GET(request: Request) {
|
||||||
try {
|
try {
|
||||||
const session = await auth()
|
|
||||||
const cookieStore = await cookies()
|
|
||||||
const cookieHeader = request.headers.get("cookie") || ""
|
const cookieHeader = request.headers.get("cookie") || ""
|
||||||
|
|
||||||
// Parse cookies from header
|
// Parse cookies from header first
|
||||||
const cookieMap: Record<string, string> = {}
|
const cookieMap: Record<string, string> = {}
|
||||||
cookieHeader.split(";").forEach(cookie => {
|
cookieHeader.split(";").forEach(cookie => {
|
||||||
const [key, value] = cookie.trim().split("=")
|
const [key, value] = cookie.trim().split("=")
|
||||||
@ -17,9 +15,26 @@ export async function GET(request: Request) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const sessionToken = cookieStore.get("__Secure-authjs.session-token")?.value ||
|
// Try to get session token from cookies
|
||||||
cookieMap["__Secure-authjs.session-token"] ||
|
const sessionTokenFromHeader = cookieMap["__Secure-authjs.session-token"] || "NOT FOUND"
|
||||||
"NOT FOUND"
|
|
||||||
|
// Try to call auth() - this might fail or return null
|
||||||
|
let session = null
|
||||||
|
let authError = null
|
||||||
|
try {
|
||||||
|
session = await auth()
|
||||||
|
} catch (err) {
|
||||||
|
authError = err instanceof Error ? err.message : String(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to get cookie from Next.js cookie store
|
||||||
|
let sessionTokenFromStore = "NOT ACCESSIBLE"
|
||||||
|
try {
|
||||||
|
const cookieStore = await cookies()
|
||||||
|
sessionTokenFromStore = cookieStore.get("__Secure-authjs.session-token")?.value || "NOT FOUND"
|
||||||
|
} catch {
|
||||||
|
// Cookie store might not be accessible in all contexts
|
||||||
|
}
|
||||||
|
|
||||||
return NextResponse.json({
|
return NextResponse.json({
|
||||||
hasSession: !!session,
|
hasSession: !!session,
|
||||||
@ -27,11 +42,14 @@ export async function GET(request: Request) {
|
|||||||
user: session.user,
|
user: session.user,
|
||||||
expires: session.expires,
|
expires: session.expires,
|
||||||
} : null,
|
} : null,
|
||||||
|
authError,
|
||||||
cookies: {
|
cookies: {
|
||||||
sessionTokenPresent: !!sessionToken && sessionToken !== "NOT FOUND",
|
sessionTokenInHeader: sessionTokenFromHeader !== "NOT FOUND",
|
||||||
sessionTokenPreview: sessionToken !== "NOT FOUND" ? `${sessionToken.substring(0, 20)}...` : "NOT FOUND",
|
sessionTokenInStore: sessionTokenFromStore !== "NOT FOUND" && sessionTokenFromStore !== "NOT ACCESSIBLE",
|
||||||
|
sessionTokenPreview: sessionTokenFromHeader !== "NOT FOUND" ? `${sessionTokenFromHeader.substring(0, 30)}...` : "NOT FOUND",
|
||||||
allCookieKeys: Object.keys(cookieMap),
|
allCookieKeys: Object.keys(cookieMap),
|
||||||
cookieHeaderLength: cookieHeader.length,
|
cookieHeaderLength: cookieHeader.length,
|
||||||
|
cookieHeaderPreview: cookieHeader.substring(0, 200),
|
||||||
},
|
},
|
||||||
env: {
|
env: {
|
||||||
hasSecret: !!process.env.NEXTAUTH_SECRET,
|
hasSecret: !!process.env.NEXTAUTH_SECRET,
|
||||||
|
|||||||
@ -61,6 +61,12 @@ export const { handlers, auth, signIn, signOut } = NextAuth({
|
|||||||
token.role = (user as { role: string }).role
|
token.role = (user as { role: string }).role
|
||||||
token.email = user.email
|
token.email = user.email
|
||||||
token.name = user.name
|
token.name = user.name
|
||||||
|
console.log("JWT callback: user added to token", { userId: user.id, email: user.email })
|
||||||
|
} else {
|
||||||
|
console.log("JWT callback: no user, token exists", {
|
||||||
|
hasToken: !!token,
|
||||||
|
tokenKeys: token ? Object.keys(token) : []
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return token
|
return token
|
||||||
},
|
},
|
||||||
@ -112,7 +118,7 @@ export const { handlers, auth, signIn, signOut } = NextAuth({
|
|||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
sameSite: "lax",
|
sameSite: "lax",
|
||||||
path: "/",
|
path: "/",
|
||||||
secure: process.env.NODE_ENV === "production",
|
secure: true, // Always secure in production (HTTPS required)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user