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.
- package/.claude/settings.local.json +280 -0
- package/CLAUDE.md +46 -0
- package/CONNECT4_PRODUCTION_DEPLOY.md +155 -0
- package/CURRENT_SESSION.md +171 -0
- package/CURRENT_SESSION_DRAW.md +516 -0
- package/MARCH_MADNESS_SURVIVOR.md +254 -0
- package/PANDA.md +166 -0
- package/Procfile +4 -0
- package/README.md +476 -0
- package/controllers/livescoresController.js +376 -0
- package/controllers/pickemController.js +554 -0
- package/controllers/survivorAdminController.js +887 -0
- package/controllers/survivorController.js +623 -0
- package/cron/oracleMonitor.js +77 -0
- package/cron/pickemOracleMonitor.js +73 -0
- package/data/jackpot-history.json +952 -0
- package/data/ncaaTeams.js +406 -0
- package/documentation/API_SECURITY_GUIDE.md +327 -0
- package/documentation/ARCADE_API.md +593 -0
- package/documentation/ARCADE_IMPLEMENTATION_SUMMARY.md +399 -0
- package/documentation/ARCADE_QUICKSTART.md +242 -0
- package/documentation/AUTOMATIC_MODE_ORACLE.md +321 -0
- package/documentation/BUG_FIX_COHORT_DATE_DISPLAY.md +171 -0
- package/documentation/CLAIM_MIGRATION_INSTRUCTIONS.md +52 -0
- package/documentation/CLAIM_STATUS_FIX.md +67 -0
- package/documentation/CLI_TOOL_GUIDE.md +372 -0
- package/documentation/COHORT_RETENTION_ANALYSIS.md +295 -0
- package/documentation/COHORT_RETENTION_IMPLEMENTATION_COMPLETE.md +461 -0
- package/documentation/COHORT_RETENTION_SUMMARY.md +204 -0
- package/documentation/COMPLETE_PROJECT_SUMMARY.md +490 -0
- package/documentation/DATABASE_QUERIES.md +269 -0
- package/documentation/DATABASE_RETENTION_POLICY.md +390 -0
- package/documentation/DATABASE_SETUP_GUIDE.md +361 -0
- package/documentation/DATABASE_SETUP_SUMMARY.md +247 -0
- package/documentation/DEMO_API_CURL_COMMANDS.md +656 -0
- package/documentation/DEPLOYMENT_SUMMARY.txt +100 -0
- package/documentation/DUPLICATE_NOTIFICATIONS_FIXED.md +201 -0
- package/documentation/EXCHANGE_RATES_INTEGRATION.md +371 -0
- package/documentation/FINAL_API_PROTECTION_TABLE.md +175 -0
- package/documentation/GAME_START_NOTIFICATIONS_DEPLOYMENT.md +256 -0
- package/documentation/GAME_START_NOTIFICATIONS_INTEGRATION.md +275 -0
- package/documentation/HEROKU_DEPLOYMENT.md +134 -0
- package/documentation/HEROKU_SCHEDULER_SETUP.md +271 -0
- package/documentation/JACKPOT_API.md +521 -0
- package/documentation/JACKPOT_DEPLOYMENT_GUIDE.md +362 -0
- package/documentation/JWT_IMPLEMENTATION_SUMMARY.md +373 -0
- package/documentation/JWT_QUICK_SETUP.md +268 -0
- package/documentation/JWT_TESTING_GUIDE.md +404 -0
- package/documentation/KEEPER_RECOVERY_GUIDE.md +381 -0
- package/documentation/KEEPER_SETUP.md +206 -0
- package/documentation/KEEPER_STATE_MACHINE.md +423 -0
- package/documentation/LATEST_PRODUCTION_SETUP.md +387 -0
- package/documentation/LOCAL_VOTING_TEST.md +279 -0
- package/documentation/ORACLE_FIXES_SUMMARY.md +188 -0
- package/documentation/ORACLE_POSTGRESQL_UPDATE.md +202 -0
- package/documentation/PAYMENT_DEPLOYMENT.md +209 -0
- package/documentation/PNL_TRACKING_SETUP.md +189 -0
- package/documentation/PREVENTING_LOCKUP_ERRORS.md +472 -0
- package/documentation/PRODUCTION_READY_SUMMARY.md +227 -0
- package/documentation/PUBLIC_VS_PRIVATE_ENDPOINTS.md +278 -0
- package/documentation/QUICK_AUTH_SETUP.md +99 -0
- package/documentation/QUICK_DEPLOY.md +224 -0
- package/documentation/QUICK_FIX.md +114 -0
- package/documentation/QUICK_START.md +152 -0
- package/documentation/REFEREE_MODE_GUIDE.md +392 -0
- package/documentation/RETENTION_CORE_ACTION_UPDATE.md +313 -0
- package/documentation/RETENTION_UPDATE_SUMMARY.md +108 -0
- package/documentation/RUN_MIGRATION_NOW.md +39 -0
- package/documentation/SCRIPTS_UPDATE_SUMMARY.md +251 -0
- package/documentation/SETUP_GUIDE.md +184 -0
- package/documentation/STATE_MACHINE_IMPLEMENTATION.md +250 -0
- package/documentation/TELEGRAM_NOTIFICATIONS_DIAGNOSIS.md +361 -0
- package/documentation/UNIFIED_ARCHITECTURE.md +231 -0
- package/documentation/VOTING_DEPLOYMENT_SUMMARY.md +392 -0
- package/documentation/WEBSOCKET_ARCHITECTURE.md +881 -0
- package/documentation/WHAT_WE_BUILT_TODAY.md +369 -0
- package/documentation/latest/LATEST_PRODUCTION_SETUP.md +865 -0
- package/ecosystem.config.js +65 -0
- package/env.template +125 -0
- package/middleware/apiKeyAuth.js +136 -0
- package/middleware/authenticate.js +214 -0
- package/middleware/developerUserAuth.js +76 -0
- package/middleware/socketAuth.js +69 -0
- package/package.json +49 -0
- package/postman/Dubs-API-v1-With-Voting.postman_collection.json +555 -0
- package/postman/Dubs-API-v1.postman_collection.json +205 -0
- package/postman/Dubs_Developer_API.postman_collection.json +662 -0
- package/postman/QUICKSTART.md +118 -0
- package/postman/QUICK_REFERENCE.md +246 -0
- package/postman/README.md +71 -0
- package/postman/VOTING_API_GUIDE.md +426 -0
- package/refactor/Animations.md +148 -0
- package/refactor/Chat.md +252 -0
- package/routes/actionsRoutes.js +699 -0
- package/routes/adminRoutes.js +370 -0
- package/routes/analyticsRoutes.js +1262 -0
- package/routes/arcadeRoutes.js +557 -0
- package/routes/authRoutes.js +2310 -0
- package/routes/avatarRoutes.js +85 -0
- package/routes/botRoutes.js +211 -0
- package/routes/chatRoutes.js +377 -0
- package/routes/cryptoPriceRoutes.js +105 -0
- package/routes/developerRoutes.js +4201 -0
- package/routes/deviceRoutes.js +214 -0
- package/routes/dmRoutes.js +167 -0
- package/routes/esportsRoutes.js +806 -0
- package/routes/exchangeRateRoutes.js +233 -0
- package/routes/gamesRoutes.js +3028 -0
- package/routes/jackpotRoutes.js +754 -0
- package/routes/keeperMonitoringRoutes.js +156 -0
- package/routes/keeperWebhookRoutes.js +466 -0
- package/routes/livescoresRoutes.js +31 -0
- package/routes/pickemAdminRoutes.js +199 -0
- package/routes/pickemRoutes.js +231 -0
- package/routes/playerStatsRoutes.js +147 -0
- package/routes/portfolioRoutes.js +217 -0
- package/routes/promoRoutes.js +418 -0
- package/routes/referralEarningsRoutes.js +392 -0
- package/routes/socialRoutes.js +459 -0
- package/routes/sportsRoutes.js +1271 -0
- package/routes/survivorAdminRoutes.js +345 -0
- package/routes/survivorRoutes.js +756 -0
- package/routes/uploadRoutes.js +256 -0
- package/routes/userProfileRoutes.js +244 -0
- package/routes/whatsNewRoutes.js +331 -0
- package/scripts/.claude/settings.local.json +15 -0
- package/scripts/README.md +170 -0
- package/scripts/RESTART_EVERYTHING.sh +104 -0
- package/scripts/add-claim-columns.sql +48 -0
- package/scripts/add-crypto-prices-cache.sql +27 -0
- package/scripts/add-exchange-rates-cache.sql +40 -0
- package/scripts/add-game-invite-column.sql +23 -0
- package/scripts/add-game-invite-notification.sql +33 -0
- package/scripts/add-game-invite-telegram-pref.sql +16 -0
- package/scripts/add-game-joined-notification.sql +16 -0
- package/scripts/add-game-joined-pref.js +40 -0
- package/scripts/add-game-joined-preference.sql +6 -0
- package/scripts/add-game-start-notifications.sql +41 -0
- package/scripts/add-notification-flags-to-games.sql +55 -0
- package/scripts/add-pending-game-dismissals.sql +19 -0
- package/scripts/add-preferred-currency.sql +34 -0
- package/scripts/add-winner-columns.js +61 -0
- package/scripts/add_mention_system.sql +53 -0
- package/scripts/add_payment_system.sql +96 -0
- package/scripts/add_sports_event_id_column.sql +22 -0
- package/scripts/analyze-cohort-data-heroku.js +276 -0
- package/scripts/analyze-cohort-data.js +295 -0
- package/scripts/analyze-prod-cohorts.sh +10 -0
- package/scripts/backfill-matchup-images.js +245 -0
- package/scripts/backfill-missing-signatures.js +175 -0
- package/scripts/backfill-referral-earnings.js +202 -0
- package/scripts/check-chat-schema.js +130 -0
- package/scripts/check-db.sh +14 -0
- package/scripts/check_oracle_in_game.js +54 -0
- package/scripts/cleanup-database.js +193 -0
- package/scripts/clear-notification-cache.js +85 -0
- package/scripts/convert-mnemonic.js +50 -0
- package/scripts/create-users-table.sql +44 -0
- package/scripts/debug-cohort-counts.js +248 -0
- package/scripts/debug-winner-calc.js +84 -0
- package/scripts/deploy-payment-system.sh +118 -0
- package/scripts/deploy-to-heroku.sh +63 -0
- package/scripts/diagnose-locked-round.js +143 -0
- package/scripts/dubs-cli.js +720 -0
- package/scripts/dump-account.js +65 -0
- package/scripts/find-vrf-offset.js +48 -0
- package/scripts/fix-chat-notifications-constraint.sql +122 -0
- package/scripts/fix-claim-columns.js +124 -0
- package/scripts/fix-constraint-now.js +44 -0
- package/scripts/fix-lock-timestamps.js +96 -0
- package/scripts/fix-locked-round.sh +126 -0
- package/scripts/fix-missing-badges.sql +91 -0
- package/scripts/fix-payment-notifications.sql +41 -0
- package/scripts/force-new-round.js +55 -0
- package/scripts/force-resolve-and-claim.js +278 -0
- package/scripts/important/README.md +115 -0
- package/scripts/important/authority-force-lock.js +197 -0
- package/scripts/important/authority-resolve-game.js +267 -0
- package/scripts/important/check-game-status.js +373 -0
- package/scripts/important/list-pending-games-by-version.js +270 -0
- package/scripts/important/reconcile-v1-v2-payouts.js +270 -0
- package/scripts/initialize-jackpot.js +111 -0
- package/scripts/jackpot/.claude/settings.local.json +10 -0
- package/scripts/jackpot/force-reset.js +84 -0
- package/scripts/jackpot/initialize-mainnet.js +100 -0
- package/scripts/jackpot/keeper.js +742 -0
- package/scripts/jackpot/status.js +107 -0
- package/scripts/jackpot/update-round-duration.js +143 -0
- package/scripts/keeper-bot.js +112 -0
- package/scripts/list-pending-games.js +131 -0
- package/scripts/migrate-chat-v2.js +127 -0
- package/scripts/migrate-chat-winners.js +84 -0
- package/scripts/migrate-chat.sh +17 -0
- package/scripts/migrate-game-invite.js +83 -0
- package/scripts/migrate-heroku-game-notifications.sh +159 -0
- package/scripts/migrations/001_analytics_tables.sql +422 -0
- package/scripts/migrations/002_add_matchup_image_url.sql +14 -0
- package/scripts/migrations/003_referral_earnings.sql +208 -0
- package/scripts/migrations/004_add_whats_new_notification_type.sql +62 -0
- package/scripts/migrations/005_add_connect4_your_turn_notification.sql +61 -0
- package/scripts/migrations/005_push_notifications.sql +55 -0
- package/scripts/migrations/006_add_draw_team_players.sql +28 -0
- package/scripts/migrations/006_add_game_cancelled_notification.sql +62 -0
- package/scripts/migrations/007_add_gif_url.sql +8 -0
- package/scripts/migrations/008_add_connect4_columns.sql +139 -0
- package/scripts/migrations/008_add_pool_tracking.sql +22 -0
- package/scripts/migrations/009_create_survivor_pool_tables.sql +174 -0
- package/scripts/migrations/010_add_survivor_pool_outcome.sql +28 -0
- package/scripts/migrations/011_create_developer_tables.sql +67 -0
- package/scripts/migrations/011_fix_keeper_tables.sql +85 -0
- package/scripts/migrations/012_create_developer_webhooks.sql +31 -0
- package/scripts/migrations/013_add_network_mode.sql +18 -0
- package/scripts/migrations/014_create_developer_app_users.sql +19 -0
- package/scripts/migrations/015_add_ui_config.sql +4 -0
- package/scripts/migrations/016_add_resolution_secret.sql +4 -0
- package/scripts/migrations/017_add_external_game_id.sql +3 -0
- package/scripts/migrations/018_create_pickem_tables.sql +115 -0
- package/scripts/migrations/019_expo_push_tokens.sql +19 -0
- package/scripts/migrations/create_whats_new_tables.sql +88 -0
- package/scripts/migrations/drop_live_games_tables.sql +34 -0
- package/scripts/open-jackpot-round.js +85 -0
- package/scripts/purge-all-data.sh +329 -0
- package/scripts/purge-all-data.sql +142 -0
- package/scripts/purge-heroku-data.sh +149 -0
- package/scripts/purge-heroku-data.sql +62 -0
- package/scripts/rebuild-heroku-database.sh +113 -0
- package/scripts/recover-funds.js +357 -0
- package/scripts/regenerate-epl-images.js +278 -0
- package/scripts/resize-s3-matchup-images.js +374 -0
- package/scripts/resolve-direct.js +88 -0
- package/scripts/resolve-mock-game.js +124 -0
- package/scripts/resolve-pickem-game.js +55 -0
- package/scripts/resolve-round-manual.js +83 -0
- package/scripts/resolve-stuck-game.js +382 -0
- package/scripts/resolve-stuck-round.js +42 -0
- package/scripts/run-connect4-migration.sh +16 -0
- package/scripts/run-mention-migration.sh +32 -0
- package/scripts/run-payment-migration.sh +51 -0
- package/scripts/run-preferred-currency-migration.sh +31 -0
- package/scripts/run-referral-earnings-migration.sh +32 -0
- package/scripts/run-survivor-outcome-migration.sh +16 -0
- package/scripts/seed-test-users.js +346 -0
- package/scripts/setup-auth-tables.js +78 -0
- package/scripts/setup-complete-database.sql +992 -0
- package/scripts/setup-database-fresh.sh +359 -0
- package/scripts/setup-heroku-keeper.sh +48 -0
- package/scripts/setup-keeper-database.js +83 -0
- package/scripts/setup-keeper-state-db.sql +110 -0
- package/scripts/setup-oracle.sh +39 -0
- package/scripts/setup-pnl-tracking.js +111 -0
- package/scripts/start-devnet.sh +14 -0
- package/scripts/test-arcade-devnet.sh +160 -0
- package/scripts/test-arcade-match.sh +109 -0
- package/scripts/test-automatic-mode.sh +239 -0
- package/scripts/test-connect4-cancel-claim.js +370 -0
- package/scripts/test-connect4-e2e.js +369 -0
- package/scripts/test-connect4-resolve.js +369 -0
- package/scripts/test-game-state-endpoint.js +136 -0
- package/scripts/test-invite-notification.js +86 -0
- package/scripts/test-jackpot-api.sh +71 -0
- package/scripts/test-poll-confirmation.js +267 -0
- package/scripts/test-resolve-game.js +271 -0
- package/scripts/test-resolve-signature.js +223 -0
- package/scripts/test-signature-preservation.js +124 -0
- package/scripts/test-state-machine.js +291 -0
- package/scripts/test-webhook-receiver.js +60 -0
- package/scripts/update-notification-constraint.js +52 -0
- package/scripts/verify-account-layout.js +145 -0
- package/scripts/verify-winner-algorithm.js +278 -0
- package/server.js +5259 -0
- package/services/arcadeMatchService.js +763 -0
- package/services/automaticGameOracle.js +1596 -0
- package/services/chatService.js +1612 -0
- package/services/connect4GameService.js +1049 -0
- package/services/connect4NotificationService.js +374 -0
- package/services/cryptoPriceService.js +223 -0
- package/services/customGameResolver.js +260 -0
- package/services/db.js +79 -0
- package/services/directMessageService.js +389 -0
- package/services/discordNotifications.js +160 -0
- package/services/exchangeRateService.js +289 -0
- package/services/expoPushService.js +314 -0
- package/services/gamesCacheService.js +539 -0
- package/services/jackpotHistory.js +331 -0
- package/services/jackpotService.js +856 -0
- package/services/keeperStateService.js +355 -0
- package/services/matchupImageService.js +591 -0
- package/services/notificationCacheService.js +407 -0
- package/services/pickemOracle.js +440 -0
- package/services/playerStatsService.js +389 -0
- package/services/portfolioService.js +555 -0
- package/services/promoService.js +757 -0
- package/services/promoTreasuryService.js +239 -0
- package/services/pushNotifications.js +353 -0
- package/services/redisService.js +422 -0
- package/services/referralEarningsService.js +728 -0
- package/services/s3Service.js +396 -0
- package/services/socialService.js +1202 -0
- package/services/survivorOracle.js +469 -0
- package/services/survivorSimulator.js +475 -0
- package/services/telegramNotifications.js +461 -0
- package/services/userProfileStatsService.js +1185 -0
- package/services/whatsNewService.js +388 -0
- 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
|
+
|