dubs-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/.claude/settings.local.json +280 -0
  2. package/CLAUDE.md +46 -0
  3. package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
  4. package/CURRENT_SESSION.md +171 -0
  5. package/CURRENT_SESSION_DRAW.md +516 -0
  6. package/MARCH_MADNESS_SURVIVOR.md +254 -0
  7. package/PANDA.md +166 -0
  8. package/Procfile +4 -0
  9. package/README.md +476 -0
  10. package/controllers/livescoresController.js +376 -0
  11. package/controllers/pickemController.js +554 -0
  12. package/controllers/survivorAdminController.js +887 -0
  13. package/controllers/survivorController.js +623 -0
  14. package/cron/oracleMonitor.js +77 -0
  15. package/cron/pickemOracleMonitor.js +73 -0
  16. package/data/jackpot-history.json +952 -0
  17. package/data/ncaaTeams.js +406 -0
  18. package/documentation/API_SECURITY_GUIDE.md +327 -0
  19. package/documentation/ARCADE_API.md +593 -0
  20. package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
  21. package/documentation/ARCADE_QUICKSTART.md +242 -0
  22. package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
  23. package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
  24. package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
  25. package/documentation/CLAIM_STATUS_FIX.md +67 -0
  26. package/documentation/CLI_TOOL_GUIDE.md +372 -0
  27. package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
  28. package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
  29. package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
  30. package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
  31. package/documentation/DATABASE_QUERIES.md +269 -0
  32. package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
  33. package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
  34. package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
  35. package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
  36. package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
  37. package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
  38. package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
  39. package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
  40. package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
  41. package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
  42. package/documentation/HEROKU_DEPLOYMENT.md +134 -0
  43. package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
  44. package/documentation/JACKPOT_API.md +521 -0
  45. package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
  46. package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
  47. package/documentation/JWT_QUICK_SETUP.md +268 -0
  48. package/documentation/JWT_TESTING_GUIDE.md +404 -0
  49. package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
  50. package/documentation/KEEPER_SETUP.md +206 -0
  51. package/documentation/KEEPER_STATE_MACHINE.md +423 -0
  52. package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
  53. package/documentation/LOCAL_VOTING_TEST.md +279 -0
  54. package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
  55. package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
  56. package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
  57. package/documentation/PNL_TRACKING_SETUP.md +189 -0
  58. package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
  59. package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
  60. package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
  61. package/documentation/QUICK_AUTH_SETUP.md +99 -0
  62. package/documentation/QUICK_DEPLOY.md +224 -0
  63. package/documentation/QUICK_FIX.md +114 -0
  64. package/documentation/QUICK_START.md +152 -0
  65. package/documentation/REFEREE_MODE_GUIDE.md +392 -0
  66. package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
  67. package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
  68. package/documentation/RUN_MIGRATION_NOW.md +39 -0
  69. package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
  70. package/documentation/SETUP_GUIDE.md +184 -0
  71. package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
  72. package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
  73. package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
  74. package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
  75. package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
  76. package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
  77. package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
  78. package/ecosystem.config.js +65 -0
  79. package/env.template +125 -0
  80. package/middleware/apiKeyAuth.js +136 -0
  81. package/middleware/authenticate.js +214 -0
  82. package/middleware/developerUserAuth.js +76 -0
  83. package/middleware/socketAuth.js +69 -0
  84. package/package.json +49 -0
  85. package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
  86. package/postman/Dubs-API-v1.postman_collection.json +205 -0
  87. package/postman/Dubs_Developer_API.postman_collection.json +662 -0
  88. package/postman/QUICKSTART.md +118 -0
  89. package/postman/QUICK_REFERENCE.md +246 -0
  90. package/postman/README.md +71 -0
  91. package/postman/VOTING_API_GUIDE.md +426 -0
  92. package/refactor/Animations.md +148 -0
  93. package/refactor/Chat.md +252 -0
  94. package/routes/actionsRoutes.js +699 -0
  95. package/routes/adminRoutes.js +370 -0
  96. package/routes/analyticsRoutes.js +1262 -0
  97. package/routes/arcadeRoutes.js +557 -0
  98. package/routes/authRoutes.js +2310 -0
  99. package/routes/avatarRoutes.js +85 -0
  100. package/routes/botRoutes.js +211 -0
  101. package/routes/chatRoutes.js +377 -0
  102. package/routes/cryptoPriceRoutes.js +105 -0
  103. package/routes/developerRoutes.js +4201 -0
  104. package/routes/deviceRoutes.js +214 -0
  105. package/routes/dmRoutes.js +167 -0
  106. package/routes/esportsRoutes.js +806 -0
  107. package/routes/exchangeRateRoutes.js +233 -0
  108. package/routes/gamesRoutes.js +3028 -0
  109. package/routes/jackpotRoutes.js +754 -0
  110. package/routes/keeperMonitoringRoutes.js +156 -0
  111. package/routes/keeperWebhookRoutes.js +466 -0
  112. package/routes/livescoresRoutes.js +31 -0
  113. package/routes/pickemAdminRoutes.js +199 -0
  114. package/routes/pickemRoutes.js +231 -0
  115. package/routes/playerStatsRoutes.js +147 -0
  116. package/routes/portfolioRoutes.js +217 -0
  117. package/routes/promoRoutes.js +418 -0
  118. package/routes/referralEarningsRoutes.js +392 -0
  119. package/routes/socialRoutes.js +459 -0
  120. package/routes/sportsRoutes.js +1271 -0
  121. package/routes/survivorAdminRoutes.js +345 -0
  122. package/routes/survivorRoutes.js +756 -0
  123. package/routes/uploadRoutes.js +256 -0
  124. package/routes/userProfileRoutes.js +244 -0
  125. package/routes/whatsNewRoutes.js +331 -0
  126. package/scripts/.claude/settings.local.json +15 -0
  127. package/scripts/README.md +170 -0
  128. package/scripts/RESTART_EVERYTHING.sh +104 -0
  129. package/scripts/add-claim-columns.sql +48 -0
  130. package/scripts/add-crypto-prices-cache.sql +27 -0
  131. package/scripts/add-exchange-rates-cache.sql +40 -0
  132. package/scripts/add-game-invite-column.sql +23 -0
  133. package/scripts/add-game-invite-notification.sql +33 -0
  134. package/scripts/add-game-invite-telegram-pref.sql +16 -0
  135. package/scripts/add-game-joined-notification.sql +16 -0
  136. package/scripts/add-game-joined-pref.js +40 -0
  137. package/scripts/add-game-joined-preference.sql +6 -0
  138. package/scripts/add-game-start-notifications.sql +41 -0
  139. package/scripts/add-notification-flags-to-games.sql +55 -0
  140. package/scripts/add-pending-game-dismissals.sql +19 -0
  141. package/scripts/add-preferred-currency.sql +34 -0
  142. package/scripts/add-winner-columns.js +61 -0
  143. package/scripts/add_mention_system.sql +53 -0
  144. package/scripts/add_payment_system.sql +96 -0
  145. package/scripts/add_sports_event_id_column.sql +22 -0
  146. package/scripts/analyze-cohort-data-heroku.js +276 -0
  147. package/scripts/analyze-cohort-data.js +295 -0
  148. package/scripts/analyze-prod-cohorts.sh +10 -0
  149. package/scripts/backfill-matchup-images.js +245 -0
  150. package/scripts/backfill-missing-signatures.js +175 -0
  151. package/scripts/backfill-referral-earnings.js +202 -0
  152. package/scripts/check-chat-schema.js +130 -0
  153. package/scripts/check-db.sh +14 -0
  154. package/scripts/check_oracle_in_game.js +54 -0
  155. package/scripts/cleanup-database.js +193 -0
  156. package/scripts/clear-notification-cache.js +85 -0
  157. package/scripts/convert-mnemonic.js +50 -0
  158. package/scripts/create-users-table.sql +44 -0
  159. package/scripts/debug-cohort-counts.js +248 -0
  160. package/scripts/debug-winner-calc.js +84 -0
  161. package/scripts/deploy-payment-system.sh +118 -0
  162. package/scripts/deploy-to-heroku.sh +63 -0
  163. package/scripts/diagnose-locked-round.js +143 -0
  164. package/scripts/dubs-cli.js +720 -0
  165. package/scripts/dump-account.js +65 -0
  166. package/scripts/find-vrf-offset.js +48 -0
  167. package/scripts/fix-chat-notifications-constraint.sql +122 -0
  168. package/scripts/fix-claim-columns.js +124 -0
  169. package/scripts/fix-constraint-now.js +44 -0
  170. package/scripts/fix-lock-timestamps.js +96 -0
  171. package/scripts/fix-locked-round.sh +126 -0
  172. package/scripts/fix-missing-badges.sql +91 -0
  173. package/scripts/fix-payment-notifications.sql +41 -0
  174. package/scripts/force-new-round.js +55 -0
  175. package/scripts/force-resolve-and-claim.js +278 -0
  176. package/scripts/important/README.md +115 -0
  177. package/scripts/important/authority-force-lock.js +197 -0
  178. package/scripts/important/authority-resolve-game.js +267 -0
  179. package/scripts/important/check-game-status.js +373 -0
  180. package/scripts/important/list-pending-games-by-version.js +270 -0
  181. package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
  182. package/scripts/initialize-jackpot.js +111 -0
  183. package/scripts/jackpot/.claude/settings.local.json +10 -0
  184. package/scripts/jackpot/force-reset.js +84 -0
  185. package/scripts/jackpot/initialize-mainnet.js +100 -0
  186. package/scripts/jackpot/keeper.js +742 -0
  187. package/scripts/jackpot/status.js +107 -0
  188. package/scripts/jackpot/update-round-duration.js +143 -0
  189. package/scripts/keeper-bot.js +112 -0
  190. package/scripts/list-pending-games.js +131 -0
  191. package/scripts/migrate-chat-v2.js +127 -0
  192. package/scripts/migrate-chat-winners.js +84 -0
  193. package/scripts/migrate-chat.sh +17 -0
  194. package/scripts/migrate-game-invite.js +83 -0
  195. package/scripts/migrate-heroku-game-notifications.sh +159 -0
  196. package/scripts/migrations/001_analytics_tables.sql +422 -0
  197. package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
  198. package/scripts/migrations/003_referral_earnings.sql +208 -0
  199. package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
  200. package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
  201. package/scripts/migrations/005_push_notifications.sql +55 -0
  202. package/scripts/migrations/006_add_draw_team_players.sql +28 -0
  203. package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
  204. package/scripts/migrations/007_add_gif_url.sql +8 -0
  205. package/scripts/migrations/008_add_connect4_columns.sql +139 -0
  206. package/scripts/migrations/008_add_pool_tracking.sql +22 -0
  207. package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
  208. package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
  209. package/scripts/migrations/011_create_developer_tables.sql +67 -0
  210. package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
  211. package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
  212. package/scripts/migrations/013_add_network_mode.sql +18 -0
  213. package/scripts/migrations/014_create_developer_app_users.sql +19 -0
  214. package/scripts/migrations/015_add_ui_config.sql +4 -0
  215. package/scripts/migrations/016_add_resolution_secret.sql +4 -0
  216. package/scripts/migrations/017_add_external_game_id.sql +3 -0
  217. package/scripts/migrations/018_create_pickem_tables.sql +115 -0
  218. package/scripts/migrations/019_expo_push_tokens.sql +19 -0
  219. package/scripts/migrations/create_whats_new_tables.sql +88 -0
  220. package/scripts/migrations/drop_live_games_tables.sql +34 -0
  221. package/scripts/open-jackpot-round.js +85 -0
  222. package/scripts/purge-all-data.sh +329 -0
  223. package/scripts/purge-all-data.sql +142 -0
  224. package/scripts/purge-heroku-data.sh +149 -0
  225. package/scripts/purge-heroku-data.sql +62 -0
  226. package/scripts/rebuild-heroku-database.sh +113 -0
  227. package/scripts/recover-funds.js +357 -0
  228. package/scripts/regenerate-epl-images.js +278 -0
  229. package/scripts/resize-s3-matchup-images.js +374 -0
  230. package/scripts/resolve-direct.js +88 -0
  231. package/scripts/resolve-mock-game.js +124 -0
  232. package/scripts/resolve-pickem-game.js +55 -0
  233. package/scripts/resolve-round-manual.js +83 -0
  234. package/scripts/resolve-stuck-game.js +382 -0
  235. package/scripts/resolve-stuck-round.js +42 -0
  236. package/scripts/run-connect4-migration.sh +16 -0
  237. package/scripts/run-mention-migration.sh +32 -0
  238. package/scripts/run-payment-migration.sh +51 -0
  239. package/scripts/run-preferred-currency-migration.sh +31 -0
  240. package/scripts/run-referral-earnings-migration.sh +32 -0
  241. package/scripts/run-survivor-outcome-migration.sh +16 -0
  242. package/scripts/seed-test-users.js +346 -0
  243. package/scripts/setup-auth-tables.js +78 -0
  244. package/scripts/setup-complete-database.sql +992 -0
  245. package/scripts/setup-database-fresh.sh +359 -0
  246. package/scripts/setup-heroku-keeper.sh +48 -0
  247. package/scripts/setup-keeper-database.js +83 -0
  248. package/scripts/setup-keeper-state-db.sql +110 -0
  249. package/scripts/setup-oracle.sh +39 -0
  250. package/scripts/setup-pnl-tracking.js +111 -0
  251. package/scripts/start-devnet.sh +14 -0
  252. package/scripts/test-arcade-devnet.sh +160 -0
  253. package/scripts/test-arcade-match.sh +109 -0
  254. package/scripts/test-automatic-mode.sh +239 -0
  255. package/scripts/test-connect4-cancel-claim.js +370 -0
  256. package/scripts/test-connect4-e2e.js +369 -0
  257. package/scripts/test-connect4-resolve.js +369 -0
  258. package/scripts/test-game-state-endpoint.js +136 -0
  259. package/scripts/test-invite-notification.js +86 -0
  260. package/scripts/test-jackpot-api.sh +71 -0
  261. package/scripts/test-poll-confirmation.js +267 -0
  262. package/scripts/test-resolve-game.js +271 -0
  263. package/scripts/test-resolve-signature.js +223 -0
  264. package/scripts/test-signature-preservation.js +124 -0
  265. package/scripts/test-state-machine.js +291 -0
  266. package/scripts/test-webhook-receiver.js +60 -0
  267. package/scripts/update-notification-constraint.js +52 -0
  268. package/scripts/verify-account-layout.js +145 -0
  269. package/scripts/verify-winner-algorithm.js +278 -0
  270. package/server.js +5259 -0
  271. package/services/arcadeMatchService.js +763 -0
  272. package/services/automaticGameOracle.js +1596 -0
  273. package/services/chatService.js +1612 -0
  274. package/services/connect4GameService.js +1049 -0
  275. package/services/connect4NotificationService.js +374 -0
  276. package/services/cryptoPriceService.js +223 -0
  277. package/services/customGameResolver.js +260 -0
  278. package/services/db.js +79 -0
  279. package/services/directMessageService.js +389 -0
  280. package/services/discordNotifications.js +160 -0
  281. package/services/exchangeRateService.js +289 -0
  282. package/services/expoPushService.js +314 -0
  283. package/services/gamesCacheService.js +539 -0
  284. package/services/jackpotHistory.js +331 -0
  285. package/services/jackpotService.js +856 -0
  286. package/services/keeperStateService.js +355 -0
  287. package/services/matchupImageService.js +591 -0
  288. package/services/notificationCacheService.js +407 -0
  289. package/services/pickemOracle.js +440 -0
  290. package/services/playerStatsService.js +389 -0
  291. package/services/portfolioService.js +555 -0
  292. package/services/promoService.js +757 -0
  293. package/services/promoTreasuryService.js +239 -0
  294. package/services/pushNotifications.js +353 -0
  295. package/services/redisService.js +422 -0
  296. package/services/referralEarningsService.js +728 -0
  297. package/services/s3Service.js +396 -0
  298. package/services/socialService.js +1202 -0
  299. package/services/survivorOracle.js +469 -0
  300. package/services/survivorSimulator.js +475 -0
  301. package/services/telegramNotifications.js +461 -0
  302. package/services/userProfileStatsService.js +1185 -0
  303. package/services/whatsNewService.js +388 -0
  304. package/utils/urlHelper.js +95 -0
@@ -0,0 +1,404 @@
1
+ # 🧪 JWT Authentication Testing Guide
2
+
3
+ ## ⚠️ Critical Fixes Applied
4
+
5
+ I found and fixed **3 critical bugs** that were preventing JWT authentication from working:
6
+
7
+ ### Bug #1: Session Not Created on Wallet Connection
8
+ **Problem:** When existing users connected their wallet, the code checked if they existed in the database and marked them as "authenticated", but **never actually called the login endpoint** to create a JWT session.
9
+
10
+ **Fix:** Updated `AuthContext` to:
11
+ 1. First check if there's a valid JWT session (via `validateSession()`)
12
+ 2. If no valid session, prompt user to sign in (which creates JWT session)
13
+
14
+ ### Bug #2: Cookie SameSite Policy
15
+ **Problem:** `sameSite: 'strict'` blocks cookies between different ports in development (localhost:3000 → localhost:3001).
16
+
17
+ **Fix:** Changed to `sameSite: 'lax'` in development, `'strict'` in production.
18
+
19
+ ### Bug #3: Error Handling in Logout
20
+ **Problem:** Logout would throw errors if there was no session.
21
+
22
+ **Fix:** Added proper error handling to ignore 401 errors on logout.
23
+
24
+ ---
25
+
26
+ ## 🚀 How to Test the Fix
27
+
28
+ ### Step 1: Restart Both Servers
29
+
30
+ ```bash
31
+ # Terminal 1 - Backend
32
+ cd dubs-server
33
+ npm start
34
+
35
+ # Terminal 2 - Frontend
36
+ cd dubs-jackpot
37
+ npm run dev
38
+ ```
39
+
40
+ **Important:** You MUST restart both servers for changes to take effect!
41
+
42
+ ### Step 2: Clear Browser State
43
+
44
+ 1. Open DevTools (F12)
45
+ 2. Go to Application → Storage
46
+ 3. Click "Clear site data"
47
+ 4. Refresh the page
48
+
49
+ This removes any old cookies or state.
50
+
51
+ ### Step 3: Test New User Registration
52
+
53
+ 1. Navigate to `http://localhost:3000/v2`
54
+ 2. Click **"Connect Wallet"**
55
+ 3. Select your wallet and connect
56
+ 4. You should see the **"Sign Message"** modal
57
+ 5. Click **"Sign Message"** in the modal
58
+ 6. Sign the message in your wallet
59
+ 7. You should see the **"Complete Your Profile"** registration modal
60
+ 8. Fill in:
61
+ - Username (required)
62
+ - Email (required)
63
+ - Avatar URL (optional)
64
+ - Referral Code (optional)
65
+ 9. Click **"Create Account"**
66
+
67
+ **Expected Result:**
68
+ - ✅ User registered
69
+ - ✅ JWT token created
70
+ - ✅ Cookie set in browser
71
+ - ✅ User marked as authenticated
72
+
73
+ ### Step 4: Verify JWT Cookie
74
+
75
+ 1. Open DevTools → Application → Cookies → `http://localhost:3000`
76
+ 2. Look for cookie named `auth_token`
77
+ 3. Verify properties:
78
+ - ✅ `HttpOnly`: Yes
79
+ - ✅ `Secure`: No (dev mode)
80
+ - ✅ `SameSite`: Lax (dev mode)
81
+ - ✅ `Path`: /
82
+ - ✅ `Expires`: 7 days from now
83
+
84
+ **Screenshot where to find:**
85
+ ```
86
+ DevTools > Application (tab)
87
+ > Storage (left sidebar)
88
+ > Cookies
89
+ > http://localhost:3000
90
+ > auth_token (should appear here)
91
+ ```
92
+
93
+ ### Step 5: Test Authenticated API Call
94
+
95
+ Open browser console and run:
96
+
97
+ ```javascript
98
+ fetch('http://localhost:3001/auth/validate-session', {
99
+ credentials: 'include'
100
+ })
101
+ .then(r => r.json())
102
+ .then(data => console.log('Session validation:', data))
103
+ .catch(err => console.error('Error:', err));
104
+ ```
105
+
106
+ **Expected Result:**
107
+ ```json
108
+ {
109
+ "success": true,
110
+ "valid": true,
111
+ "user": {
112
+ "id": 1,
113
+ "wallet_address": "your_wallet_address",
114
+ "username": "your_username",
115
+ "email": "your_email",
116
+ "onboarding_complete": false
117
+ }
118
+ }
119
+ ```
120
+
121
+ ### Step 6: Complete Onboarding
122
+
123
+ 1. Click through the onboarding modal
124
+ 2. Click **"Start Playing"** or similar button
125
+
126
+ **Expected Result:**
127
+ - ✅ `onboarding_complete` set to `true`
128
+ - ✅ User marked as fully authenticated
129
+
130
+ ### Step 7: Test Logout
131
+
132
+ 1. Open the user menu (hamburger icon / profile icon)
133
+ 2. Click **"Disconnect Wallet"**
134
+
135
+ **Expected Result:**
136
+ - ✅ Logout API call succeeds (200 OK)
137
+ - ✅ Cookie cleared from browser
138
+ - ✅ User disconnected
139
+ - ✅ Auth state reset
140
+
141
+ ### Step 8: Test Existing User Login
142
+
143
+ 1. Connect wallet again (same wallet as before)
144
+ 2. You should see **"Sign Message"** modal (to create new session)
145
+ 3. Sign the message
146
+ 4. **NO registration form** should appear
147
+ 5. You should be automatically logged in
148
+
149
+ **Expected Result:**
150
+ - ✅ User detected as existing
151
+ - ✅ Login endpoint called (not register)
152
+ - ✅ JWT token created
153
+ - ✅ Cookie set
154
+ - ✅ User authenticated immediately
155
+
156
+ ---
157
+
158
+ ## 🔍 Debugging Checklist
159
+
160
+ ### If Registration Fails
161
+
162
+ **Check Backend Logs:**
163
+ ```bash
164
+ # Should see:
165
+ [Auth] Nonce generated successfully
166
+ [Auth] Signature verified successfully, nonce marked as used
167
+ [Auth] User registered and session created: <wallet_address>
168
+ ```
169
+
170
+ **Check Network Tab (DevTools):**
171
+ - `POST /auth/nonce/<wallet>` → 200 OK
172
+ - `POST /auth/verify-signature` → 200 OK, `{ valid: true }`
173
+ - `POST /auth/register` → 200 OK, sets cookie
174
+
175
+ ### If Cookie Not Set
176
+
177
+ **Check Response Headers (Network Tab → /auth/register):**
178
+ ```
179
+ Set-Cookie: auth_token=eyJhbGc...; Path=/; HttpOnly; SameSite=Lax
180
+ ```
181
+
182
+ **Common Issues:**
183
+ 1. ❌ CORS not configured → Add `withCredentials: true` to axios
184
+ 2. ❌ Cookie blocked → Check `sameSite` is `lax` in dev
185
+ 3. ❌ Wrong domain → Verify cookie domain matches frontend
186
+ 4. ❌ Browser privacy settings → Disable "Block third-party cookies"
187
+
188
+ ### If 401 Unauthorized on Protected Endpoints
189
+
190
+ **Check:**
191
+ 1. Cookie exists in Application → Cookies
192
+ 2. Cookie is being sent (Network tab → Request Headers → `Cookie: auth_token=...`)
193
+ 3. Token hasn't expired (check `expires_at` in database)
194
+ 4. Session exists in database:
195
+ ```sql
196
+ SELECT * FROM user_sessions WHERE expires_at > NOW();
197
+ ```
198
+
199
+ ### If Login Doesn't Work
200
+
201
+ **Check Console Logs:**
202
+ ```
203
+ [Auth] Checking for existing session...
204
+ [Auth] No valid session, checking if user exists...
205
+ [Auth] User exists but needs to sign in
206
+ [Auth] Existing user detected, logging in...
207
+ [Auth] User logged in successfully: <wallet>
208
+ ```
209
+
210
+ **Check Network Tab:**
211
+ - `GET /auth/validate-session` → 401 (expected if no session)
212
+ - `GET /auth/user/<wallet>` → 200 OK (user exists)
213
+ - `POST /auth/login` → 200 OK, sets cookie
214
+
215
+ ---
216
+
217
+ ## 🧪 Database Verification
218
+
219
+ ### Check User Created
220
+ ```sql
221
+ SELECT wallet_address, username, email, onboarding_complete, created_at
222
+ FROM users
223
+ ORDER BY created_at DESC
224
+ LIMIT 5;
225
+ ```
226
+
227
+ ### Check Session Created
228
+ ```sql
229
+ SELECT
230
+ s.id,
231
+ s.wallet_address,
232
+ u.username,
233
+ s.expires_at,
234
+ s.created_at,
235
+ s.last_activity
236
+ FROM user_sessions s
237
+ JOIN users u ON s.user_id = u.id
238
+ WHERE s.expires_at > NOW()
239
+ ORDER BY s.created_at DESC;
240
+ ```
241
+
242
+ ### Check Nonces
243
+ ```sql
244
+ SELECT wallet_address, nonce, expires_at, used, created_at
245
+ FROM auth_nonces
246
+ ORDER BY created_at DESC
247
+ LIMIT 5;
248
+ ```
249
+
250
+ ---
251
+
252
+ ## 🎯 Success Criteria
253
+
254
+ You know authentication is working when:
255
+
256
+ - ✅ New users can register
257
+ - ✅ JWT cookie appears in browser
258
+ - ✅ Registration sets `auth_token` cookie
259
+ - ✅ Login sets `auth_token` cookie
260
+ - ✅ `/auth/validate-session` returns 200 OK with user data
261
+ - ✅ Protected endpoints accept authenticated requests
262
+ - ✅ Logout clears cookie and session
263
+ - ✅ Existing users can sign in again
264
+ - ✅ Sessions persist across page refreshes
265
+ - ✅ Multiple tabs share same session
266
+
267
+ ---
268
+
269
+ ## 🐛 Common Errors & Fixes
270
+
271
+ ### Error: "JWT_SECRET not set"
272
+ **Fix:** Add to `.env`:
273
+ ```bash
274
+ JWT_SECRET=$(node -e "console.log(require('crypto').randomBytes(64).toString('hex'))")
275
+ ```
276
+
277
+ ### Error: "Database connection error"
278
+ **Fix:**
279
+ 1. Check PostgreSQL is running: `psql --version`
280
+ 2. Verify DATABASE_URL in `.env`
281
+ 3. Test connection: `psql $DATABASE_URL -c "SELECT 1"`
282
+
283
+ ### Error: "Cookie not being sent"
284
+ **Fix:**
285
+ 1. Verify `withCredentials: true` in api.ts ✅ (already set)
286
+ 2. Verify `credentials: true` in CORS ✅ (already set)
287
+ 3. Check cookie `sameSite` is `lax` ✅ (fixed)
288
+ 4. Restart both servers
289
+
290
+ ### Error: "401 Unauthorized" after registration
291
+ **Fix:**
292
+ - Check session was created in database
293
+ - Verify cookie was set (DevTools → Application → Cookies)
294
+ - Check backend logs for errors
295
+
296
+ ### Error: "Logout fails with 401"
297
+ **Fix:** ✅ Already handled - logout now ignores 401 errors
298
+
299
+ ---
300
+
301
+ ## 📱 Testing on Different Browsers
302
+
303
+ Test on multiple browsers to verify cookie behavior:
304
+
305
+ - ✅ Chrome (strict cookie policies)
306
+ - ✅ Firefox (different cookie handling)
307
+ - ✅ Safari (very strict, might block)
308
+ - ✅ Brave (aggressive blocking, might fail)
309
+
310
+ **Note:** Some privacy-focused browsers block cross-origin cookies by default.
311
+
312
+ ---
313
+
314
+ ## 🔐 Security Verification
315
+
316
+ ### Check Cookie Security
317
+ ```javascript
318
+ // In browser console
319
+ document.cookie
320
+ // Should return empty (httpOnly prevents access)
321
+ ```
322
+
323
+ ### Check Token in Database
324
+ ```sql
325
+ SELECT token_hash FROM user_sessions LIMIT 1;
326
+ -- Should be a SHA256 hash, NOT the raw JWT
327
+ ```
328
+
329
+ ### Verify HTTPS in Production
330
+ ```bash
331
+ # In production .env
332
+ NODE_ENV=production
333
+
334
+ # Cookie should have Secure flag
335
+ # Check in DevTools → Application → Cookies → Secure: Yes
336
+ ```
337
+
338
+ ---
339
+
340
+ ## 📊 Expected Network Flow
341
+
342
+ ### New User Registration:
343
+ ```
344
+ 1. GET /auth/nonce/<wallet> → 200 OK
345
+ 2. POST /auth/verify-signature → 200 OK
346
+ 3. POST /auth/register → 200 OK + Set-Cookie
347
+ 4. GET /auth/validate-session → 200 OK (with cookie)
348
+ ```
349
+
350
+ ### Existing User Login:
351
+ ```
352
+ 1. GET /auth/nonce/<wallet> → 200 OK
353
+ 2. POST /auth/login → 200 OK + Set-Cookie
354
+ 3. GET /auth/validate-session → 200 OK (with cookie)
355
+ ```
356
+
357
+ ### Logout:
358
+ ```
359
+ 1. POST /auth/logout → 200 OK + Clear cookie
360
+ 2. GET /auth/validate-session → 401 Unauthorized
361
+ ```
362
+
363
+ ---
364
+
365
+ ## ✅ Final Checklist
366
+
367
+ Before moving to production:
368
+
369
+ - [ ] JWT_SECRET is strong and unique (64+ chars)
370
+ - [ ] NODE_ENV=production in prod .env
371
+ - [ ] Database has SSL enabled
372
+ - [ ] CORS origins restricted to your domains
373
+ - [ ] Cookie Secure flag enabled (HTTPS)
374
+ - [ ] Session cleanup cron job running
375
+ - [ ] Monitoring/logging set up
376
+ - [ ] Rate limiting configured
377
+ - [ ] Database backups enabled
378
+
379
+ ---
380
+
381
+ ## 🆘 Still Having Issues?
382
+
383
+ 1. **Check all console logs** (frontend + backend)
384
+ 2. **Check Network tab** for all API calls
385
+ 3. **Check Database** for users/sessions
386
+ 4. **Verify environment variables** are loaded
387
+ 5. **Restart both servers** completely
388
+ 6. **Clear browser data** and try again
389
+
390
+ If still stuck:
391
+ - Review `JWT_QUICK_SETUP.md`
392
+ - Review `documentation/JWT_AUTHENTICATION.md`
393
+ - Check server logs for specific error messages
394
+
395
+ ---
396
+
397
+ **Remember:** The key changes were:
398
+ 1. ✅ Session validation on wallet connect
399
+ 2. ✅ Cookie SameSite set to 'lax' in dev
400
+ 3. ✅ Proper error handling in logout
401
+
402
+ **These fixes make the authentication flow work correctly!**
403
+
404
+