feat(FE) : json role
This commit is contained in:
No files matched your search
@@ -128,15 +128,30 @@ export default defineEventHandler(async (event) => {
|
||||
const tokens = await tokenResponse.json();
|
||||
|
||||
let idTokenPayload;
|
||||
let accessTokenPayload;
|
||||
try {
|
||||
idTokenPayload = JSON.parse(
|
||||
Buffer.from(tokens.id_token.split('.')[1], 'base64').toString()
|
||||
);
|
||||
accessTokenPayload = JSON.parse(
|
||||
Buffer.from(tokens.access_token.split('.')[1], 'base64').toString()
|
||||
);
|
||||
} catch (decodeError) {
|
||||
console.error('❌ Failed to decode ID token:', decodeError);
|
||||
const errorMsg = encodeURIComponent('Invalid ID token format');
|
||||
return sendRedirect(event, `/auth/login?error=${errorMsg}`);
|
||||
}
|
||||
|
||||
// Extract roles from Keycloak token
|
||||
// Keycloak stores roles in different places depending on configuration
|
||||
const realmRoles = accessTokenPayload.realm_access?.roles || [];
|
||||
const clientRoles = accessTokenPayload.resource_access?.account?.roles || [];
|
||||
const allRoles = [...new Set([...realmRoles, ...clientRoles])]; // Remove duplicates
|
||||
|
||||
console.log('👥 User Roles Extracted:');
|
||||
console.log(' - Realm Roles:', realmRoles);
|
||||
console.log(' - Client Roles:', clientRoles);
|
||||
console.log(' - All Roles:', allRoles);
|
||||
|
||||
// Store minimal session data in cookie to reduce size
|
||||
// The ID token contains user info, so we can decode it when needed
|
||||
@@ -147,6 +162,9 @@ export default defineEventHandler(async (event) => {
|
||||
email: idTokenPayload.email,
|
||||
name: idTokenPayload.name || idTokenPayload.preferred_username,
|
||||
preferred_username: idTokenPayload.preferred_username,
|
||||
roles: allRoles, // All user roles combined
|
||||
realm_roles: realmRoles, // Realm-specific roles
|
||||
client_roles: clientRoles, // Client-specific roles
|
||||
},
|
||||
// Store tokens - these are necessary for API calls
|
||||
// Note: These JWT tokens are large, but necessary for authentication
|
||||
@@ -210,15 +228,29 @@ export default defineEventHandler(async (event) => {
|
||||
console.log(' - MaxAge:', SESSION_DURATION, 'seconds');
|
||||
console.log(' - Host:', event.node.req.headers.host);
|
||||
|
||||
// Auto-sync user data to database (first time login check)
|
||||
// Pass session createdAt as loginTime to sync function
|
||||
// Auto-sync hakAkses and user data after successful login
|
||||
try {
|
||||
const { syncUserFromTokens } = await import('~/server/utils/userSync');
|
||||
const result = syncUserFromTokens(tokens.id_token, tokens.access_token, sessionData.createdAt);
|
||||
console.log(`✅ User auto-sync on login: ${result.action} - ${result.message}`);
|
||||
console.log('🔄 Starting auto-sync process...');
|
||||
|
||||
// 1. Sync hakAkses (roles) to hakAkses.json
|
||||
const { syncHakAksesFromRoles } = await import('~/server/utils/hakAksesSync');
|
||||
const hakAksesResult = syncHakAksesFromRoles(clientRoles);
|
||||
console.log(`📋 HakAkses sync result:`, hakAksesResult);
|
||||
|
||||
// 2. Sync user data to users.json
|
||||
const { syncUserData } = await import('~/server/utils/userDataSync');
|
||||
const userResult = syncUserData({
|
||||
id: sessionData.user.id,
|
||||
name: sessionData.user.name,
|
||||
email: sessionData.user.email,
|
||||
roles: clientRoles
|
||||
});
|
||||
console.log(`👤 User sync result: ${userResult.action} - ${userResult.message}`);
|
||||
|
||||
console.log('✅ Auto-sync process completed successfully');
|
||||
} catch (syncError: any) {
|
||||
// Don't fail the login if sync fails, just log it
|
||||
console.error('⚠️ Failed to auto-sync user on login:', syncError);
|
||||
console.error('⚠️ Failed to auto-sync data on login:', syncError);
|
||||
}
|
||||
|
||||
// IMPORTANT: Ensure cookie is set before redirect
|
||||
|
||||
Reference in New Issue
Block a user