push update socket data dan token
This commit is contained in:
@@ -1,74 +1,73 @@
|
||||
// server/api/auth/session.get.ts
|
||||
import type { SessionResponse } from '~/types/auth'
|
||||
|
||||
// Helper function to safely decode the JWT payload (Access Token or ID Token)
|
||||
const decodeTokenPayload = (token: string | undefined): any | null => {
|
||||
if (!token) return null;
|
||||
try {
|
||||
// Tokens are base64 encoded and separated by '.'
|
||||
const parts = token.split(".");
|
||||
if (parts.length < 2) return null; // Not a valid JWT format
|
||||
|
||||
const payloadBase64 = parts[1];
|
||||
|
||||
// Decode from base64 and parse the JSON
|
||||
// Note: Using Buffer.from is standard in Node.js server environments (like Nitro/H3)
|
||||
return JSON.parse(Buffer.from(payloadBase64, "base64").toString());
|
||||
} catch (e) {
|
||||
console.error("❌ Failed to decode token payload:", e);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
// --- START OF THE SINGLE EXPORT DEFAULT HANDLER ---
|
||||
export default defineEventHandler(async (event) => {
|
||||
console.log("🔍 Session endpoint called");
|
||||
console.log('🔍 Session endpoint called');
|
||||
|
||||
const sessionId = getCookie(event, "user_session");
|
||||
console.log("🍪 Session cookie exists:", !!sessionId);
|
||||
const sessionCookie = getCookie(event, 'user_session');
|
||||
console.log('🍪 Session cookie exists:', !!sessionCookie);
|
||||
|
||||
if (!sessionId) {
|
||||
console.log("❌ No session cookie found");
|
||||
if (!sessionCookie) {
|
||||
console.log('❌ No session cookie found');
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
statusMessage: "No session cookie found",
|
||||
statusMessage: 'No session cookie found',
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
// Get session from server-side store using session ID
|
||||
// Get session from store using session ID
|
||||
const { getSession } = await import('~/server/utils/sessionStore');
|
||||
const session = getSession(sessionId);
|
||||
const session = getSession(sessionCookie);
|
||||
|
||||
if (!session) {
|
||||
console.log("❌ Session not found or expired");
|
||||
deleteCookie(event, "user_session");
|
||||
console.log('❌ Session not found in store or expired');
|
||||
deleteCookie(event, 'user_session');
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
statusMessage: "Session expired or invalid",
|
||||
statusMessage: 'Session not found or expired',
|
||||
});
|
||||
}
|
||||
|
||||
console.log("📋 Session retrieved from store successfully");
|
||||
console.log('📋 Session retrieved from store successfully');
|
||||
|
||||
// Parse token payloads on-demand from tokens
|
||||
let accessTokenPayload = null;
|
||||
let idTokenPayload = null;
|
||||
|
||||
try {
|
||||
if (session.accessToken) {
|
||||
const accessParts = session.accessToken.split('.');
|
||||
if (accessParts.length >= 2) {
|
||||
accessTokenPayload = JSON.parse(Buffer.from(accessParts[1], 'base64').toString());
|
||||
}
|
||||
}
|
||||
|
||||
if (session.idToken) {
|
||||
const idParts = session.idToken.split('.');
|
||||
if (idParts.length >= 2) {
|
||||
idTokenPayload = JSON.parse(Buffer.from(idParts[1], 'base64').toString());
|
||||
}
|
||||
}
|
||||
} catch (parseError) {
|
||||
console.warn('⚠️ Failed to parse token payloads:', parseError);
|
||||
}
|
||||
|
||||
|
||||
const isExpired = Date.now() > session.expiresAt;
|
||||
console.log(" Is Expired:", isExpired);
|
||||
console.log(' Is Expired:', isExpired);
|
||||
|
||||
// Check if the token has expired
|
||||
// Check if the session has expired
|
||||
if (isExpired) {
|
||||
console.log("⏰ Session has expired, clearing cookie");
|
||||
deleteCookie(event, "user_session");
|
||||
console.log('⏰ Session has expired, clearing cookie');
|
||||
deleteCookie(event, 'user_session');
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
statusMessage: "Session expired",
|
||||
statusMessage: 'Session expired',
|
||||
});
|
||||
}
|
||||
|
||||
// Decode tokens and prepare the enhanced response data
|
||||
const idTokenPayload = decodeTokenPayload(session.idToken);
|
||||
const accessTokenPayload = decodeTokenPayload(session.accessToken);
|
||||
|
||||
// Final response object - ensure it matches SessionResponse interface
|
||||
// Return the full session data (already includes parsed payloads)
|
||||
const sessionResponse: SessionResponse & {
|
||||
idTokenPayload?: any
|
||||
accessTokenPayload?: any
|
||||
@@ -76,37 +75,55 @@ export default defineEventHandler(async (event) => {
|
||||
status?: string
|
||||
remainingSeconds?: number
|
||||
idToken?: string
|
||||
scope?: string
|
||||
createdAt?: number
|
||||
} = {
|
||||
success: true,
|
||||
// Basic User Info
|
||||
user: session.user,
|
||||
|
||||
// Raw Tokens (optional in SessionResponse)
|
||||
// Raw Tokens
|
||||
accessToken: session.accessToken,
|
||||
refreshToken: session.refreshToken,
|
||||
idToken: session.idToken,
|
||||
|
||||
// Session Timestamps (optional in SessionResponse)
|
||||
// Session Timestamps
|
||||
expiresAt: session.expiresAt,
|
||||
createdAt: session.createdAt,
|
||||
remainingSeconds: Math.max(0, Math.floor((session.expiresAt - Date.now()) / 1000)),
|
||||
|
||||
// Additional debug fields (not in SessionResponse interface)
|
||||
idToken: session.idToken,
|
||||
// Parsed token payloads (parsed on-demand, not stored in cookie)
|
||||
idTokenPayload: idTokenPayload,
|
||||
accessTokenPayload: accessTokenPayload,
|
||||
|
||||
// Full session for debugging
|
||||
fullSessionObject: session,
|
||||
status: "authenticated",
|
||||
|
||||
// OAuth metadata
|
||||
scope: session.scope,
|
||||
status: session.status || 'authenticated',
|
||||
};
|
||||
|
||||
console.log("✅ Session is valid, returning full session data");
|
||||
console.log('✅ Session is valid, returning full session data');
|
||||
return sessionResponse;
|
||||
} catch (parseError) {
|
||||
console.error("❌ Failed to parse session cookie:", parseError);
|
||||
// If JSON parsing fails or any other error occurs, the session is invalid
|
||||
deleteCookie(event, "user_session");
|
||||
} catch (parseError: any) {
|
||||
console.error('❌ Failed to parse session cookie:', parseError);
|
||||
|
||||
// Check if this is an old session ID format (not base64 JSON)
|
||||
if (parseError.message?.includes('Unexpected token') || parseError.message?.includes('JSON')) {
|
||||
console.log('🧹 Detected old session format, clearing cookie...');
|
||||
deleteCookie(event, 'user_session');
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
statusMessage: 'Old session format detected. Please login again.',
|
||||
});
|
||||
}
|
||||
|
||||
// If parsing fails, the session is invalid
|
||||
deleteCookie(event, 'user_session');
|
||||
throw createError({
|
||||
statusCode: 401,
|
||||
statusMessage: "Invalid session data",
|
||||
statusMessage: 'Invalid session data',
|
||||
});
|
||||
}
|
||||
});
|
||||
// --- END OF THE SINGLE EXPORT DEFAULT HANDLER ---
|
||||
Reference in New Issue
Block a user