From d91a94675cadbd053ccf3085ab24aaa4ccdf0ef4 Mon Sep 17 00:00:00 2001 From: sebastjanartic <45803536-sebastjanartic@users.noreply.replit.com> Date: Tue, 2 Sep 2025 12:47:24 +0000 Subject: [PATCH] Improve user ID generation for consistent authentication Implement deterministic UUID generation using SHA256 hashing for Replit user IDs to ensure consistent user identification across sessions and database operations. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 170e18f0-0f13-4eca-8643-546bba1dd8cc Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8cc42625-c1f5-4e43-99bd-77f2c4dedee2/170e18f0-0f13-4eca-8643-546bba1dd8cc/vqbrWR9 --- attached_assets/image_1756817062713.png | Bin 0 -> 49364 bytes server/replitAuth.ts | 23 +++++++++++++++++++---- server/routes.ts | 23 +++++++++++++++++++++-- 3 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 attached_assets/image_1756817062713.png diff --git a/attached_assets/image_1756817062713.png b/attached_assets/image_1756817062713.png new file mode 100644 index 0000000000000000000000000000000000000000..823d91178e5cc90de2b20a57759e40d458ad2656 GIT binary patch literal 49364 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 { } try { - // Convert Replit numeric ID to our internal format - const userId = `replit_${user.claims.sub}`; + // Generate the same deterministic UUID from Replit ID + const userId = generateDeterministicUUID(user.claims.sub); const dbUser = await storage.getUser(userId); if (!dbUser || !dbUser.isAdmin) { return res.status(403).json({ message: "Admin access required" }); diff --git a/server/routes.ts b/server/routes.ts index aa78b69..7e8f709 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -860,9 +860,28 @@ export async function registerRoutes(app: Express): Promise { // Auth route to get current user app.get('/api/auth/user', isAuthenticated, async (req: any, res) => { try { - const userId = `replit_${req.user.claims.sub}`; + // Import the generateDeterministicUUID function from replitAuth + const { createHash } = await import('crypto'); + function generateDeterministicUUID(replitId: string): string { + const hash = createHash('sha256').update(`replit_${replitId}`).digest('hex'); + return [ + hash.substring(0, 8), + hash.substring(8, 12), + '4' + hash.substring(13, 16), + (parseInt(hash.substring(16, 17), 16) & 0x3 | 0x8).toString(16) + hash.substring(17, 20), + hash.substring(20, 32) + ].join('-'); + } + + const userId = generateDeterministicUUID(req.user.claims.sub); const user = await storage.getUser(userId); - res.json(user); + if (!user) { + return res.status(404).json({ message: "User not found" }); + } + + // Remove sensitive data + const { passwordHash, ...userResponse } = user; + res.json(userResponse); } catch (error) { console.error("Error fetching user:", error); res.status(500).json({ message: "Failed to fetch user" });