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,327 @@
|
|
|
1
|
+
# ๐ API Security Guide - Protected Routes
|
|
2
|
+
|
|
3
|
+
## Complete API Protection Status
|
|
4
|
+
|
|
5
|
+
### ๐ Public Endpoints (No Authentication Required)
|
|
6
|
+
|
|
7
|
+
| Endpoint | Method | Purpose | Why Public? |
|
|
8
|
+
|----------|--------|---------|-------------|
|
|
9
|
+
| `/auth/nonce/:walletAddress` | GET | Get nonce for signing | Needed to start authentication flow |
|
|
10
|
+
| `/auth/user/:walletAddress` | GET | Check if user exists / Get user profile | Allows profile viewing (consider protecting later) |
|
|
11
|
+
| `/auth/verify-signature` | POST | Verify wallet signature | Part of registration flow |
|
|
12
|
+
| `/auth/register` | POST | Register new user + create session | Creates new account |
|
|
13
|
+
| `/auth/login` | POST | Login existing user + create session | Creates authenticated session |
|
|
14
|
+
| `/stats/leaderboard` | GET | Get public leaderboard | Public game data |
|
|
15
|
+
|
|
16
|
+
**Note:** `/auth/user/:walletAddress` is currently public to allow viewing other players' profiles. If you want privacy, protect this endpoint.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
### ๐ Protected Endpoints (Require JWT Authentication)
|
|
21
|
+
|
|
22
|
+
| Endpoint | Method | Protection | Additional Security |
|
|
23
|
+
|----------|--------|------------|---------------------|
|
|
24
|
+
| **Session Management** |
|
|
25
|
+
| `/auth/validate-session` | GET | ๐ JWT Required | Returns current user's session |
|
|
26
|
+
| `/auth/logout` | POST | ๐ JWT Required | Clears current session |
|
|
27
|
+
| `/auth/logout-all` | POST | ๐ JWT Required | Clears all user's sessions |
|
|
28
|
+
| **User Management** |
|
|
29
|
+
| `/auth/user/:walletAddress` | PUT | ๐ JWT Required | โ
**Wallet ownership verified** |
|
|
30
|
+
| `/auth/user/:walletAddress/onboarding-complete` | POST | ๐ JWT Required | โ
**Wallet ownership verified** |
|
|
31
|
+
| **File Uploads** |
|
|
32
|
+
| `/upload/avatar/presigned-url` | POST | ๐ JWT Required | โ
**Wallet ownership verified** |
|
|
33
|
+
| **Stats (Recommended Protection)** |
|
|
34
|
+
| `/stats/player/:walletAddress` | GET | โ ๏ธ Currently Public | Should verify wallet ownership |
|
|
35
|
+
| `/stats/player/:walletAddress/history` | GET | โ ๏ธ Currently Public | Should verify wallet ownership |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## ๐ก๏ธ Security Features by Endpoint
|
|
40
|
+
|
|
41
|
+
### Protected with Wallet Ownership Verification
|
|
42
|
+
|
|
43
|
+
These endpoints not only require authentication but also verify you can only access your own data:
|
|
44
|
+
|
|
45
|
+
#### `PUT /auth/user/:walletAddress`
|
|
46
|
+
```javascript
|
|
47
|
+
// User can only update their OWN profile
|
|
48
|
+
if (req.user.walletAddress !== walletAddress) {
|
|
49
|
+
return 403 Forbidden
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### `POST /auth/user/:walletAddress/onboarding-complete`
|
|
54
|
+
```javascript
|
|
55
|
+
// User can only complete their OWN onboarding
|
|
56
|
+
if (req.user.walletAddress !== walletAddress) {
|
|
57
|
+
return 403 Forbidden
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### `POST /upload/avatar/presigned-url`
|
|
62
|
+
```javascript
|
|
63
|
+
// User can only upload THEIR OWN avatar
|
|
64
|
+
if (req.user.walletAddress !== walletAddress) {
|
|
65
|
+
return 403 Forbidden
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## ๐ง How Authentication Works
|
|
72
|
+
|
|
73
|
+
### For Protected Endpoints
|
|
74
|
+
|
|
75
|
+
1. **Request includes JWT cookie** (automatic via `withCredentials: true`)
|
|
76
|
+
2. **Middleware validates token:**
|
|
77
|
+
- Checks cookie exists
|
|
78
|
+
- Verifies JWT signature
|
|
79
|
+
- Checks token not expired
|
|
80
|
+
- Verifies session exists in database
|
|
81
|
+
3. **User info attached to request:**
|
|
82
|
+
```javascript
|
|
83
|
+
req.user = {
|
|
84
|
+
walletAddress: "7D47yF...",
|
|
85
|
+
userId: 123
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
4. **Endpoint logic executes** with authenticated user context
|
|
89
|
+
|
|
90
|
+
### Error Responses
|
|
91
|
+
|
|
92
|
+
| Status | Code | Meaning |
|
|
93
|
+
|--------|------|---------|
|
|
94
|
+
| 401 | `NO_TOKEN` | No auth token provided |
|
|
95
|
+
| 401 | `TOKEN_EXPIRED` | JWT token expired (> 7 days) |
|
|
96
|
+
| 401 | `INVALID_TOKEN` | Token malformed or invalid |
|
|
97
|
+
| 401 | `SESSION_INVALID` | Session not in database |
|
|
98
|
+
| 403 | `WALLET_MISMATCH` | Trying to access another user's data |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## ๐ Stats Endpoints - Recommended Changes
|
|
103
|
+
|
|
104
|
+
Currently public but should be protected:
|
|
105
|
+
|
|
106
|
+
### Current Implementation (INSECURE)
|
|
107
|
+
```javascript
|
|
108
|
+
// Anyone can see anyone's stats
|
|
109
|
+
GET /stats/player/ANY_WALLET_ADDRESS โ 200 OK
|
|
110
|
+
GET /stats/player/ANY_WALLET_ADDRESS/history โ 200 OK
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Recommended Implementation (SECURE)
|
|
114
|
+
```javascript
|
|
115
|
+
router.get('/player/:walletAddress', authenticate, async (req, res) => {
|
|
116
|
+
// Allow users to see their own stats
|
|
117
|
+
if (req.user.walletAddress === req.params.walletAddress) {
|
|
118
|
+
return res.json({ stats: userStats });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Optionally allow viewing others' public stats
|
|
122
|
+
// Remove this block if you want stats to be private
|
|
123
|
+
return res.json({
|
|
124
|
+
stats: {
|
|
125
|
+
// Return only public fields
|
|
126
|
+
gamesPlayed: userStats.gamesPlayed,
|
|
127
|
+
winRate: userStats.winRate,
|
|
128
|
+
// Hide sensitive data like wallet balance, etc.
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## ๐จ Security Issues Fixed
|
|
137
|
+
|
|
138
|
+
### โ
Fixed: Unprotected User Update
|
|
139
|
+
**Before:**
|
|
140
|
+
```javascript
|
|
141
|
+
PUT /auth/user/:walletAddress
|
|
142
|
+
// No authentication required
|
|
143
|
+
// Anyone could update anyone's profile!
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**After:**
|
|
147
|
+
```javascript
|
|
148
|
+
PUT /auth/user/:walletAddress + JWT + Wallet Verification
|
|
149
|
+
// โ
Must be authenticated
|
|
150
|
+
// โ
Can only update own profile
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### โ
Fixed: Unprotected Avatar Upload
|
|
154
|
+
**Before:**
|
|
155
|
+
```javascript
|
|
156
|
+
POST /upload/avatar/presigned-url
|
|
157
|
+
// No authentication required
|
|
158
|
+
// Anyone could upload avatars for anyone!
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**After:**
|
|
162
|
+
```javascript
|
|
163
|
+
POST /upload/avatar/presigned-url + JWT + Wallet Verification
|
|
164
|
+
// โ
Must be authenticated
|
|
165
|
+
// โ
Can only upload own avatar
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## ๐ฏ Frontend Integration
|
|
171
|
+
|
|
172
|
+
### Automatic Authentication
|
|
173
|
+
|
|
174
|
+
All protected endpoints work automatically because:
|
|
175
|
+
|
|
176
|
+
1. **JWT cookie sent automatically:**
|
|
177
|
+
```typescript
|
|
178
|
+
// api.ts already configured with:
|
|
179
|
+
axios.create({
|
|
180
|
+
withCredentials: true // โ
Sends cookies
|
|
181
|
+
})
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
2. **No manual token management needed!**
|
|
185
|
+
- No localStorage
|
|
186
|
+
- No Authorization headers
|
|
187
|
+
- Cookies handled by browser
|
|
188
|
+
|
|
189
|
+
### Handling Auth Errors
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// In api.ts - already configured
|
|
193
|
+
this.client.interceptors.response.use(
|
|
194
|
+
(response) => response,
|
|
195
|
+
(error) => {
|
|
196
|
+
if (error.response?.status === 401) {
|
|
197
|
+
// Session expired - trigger re-authentication
|
|
198
|
+
window.dispatchEvent(new CustomEvent('auth:session-expired'));
|
|
199
|
+
}
|
|
200
|
+
return Promise.reject(error);
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## ๐ How to Protect More Endpoints
|
|
208
|
+
|
|
209
|
+
### Step 1: Import Middleware
|
|
210
|
+
```javascript
|
|
211
|
+
const { authenticate } = require('../middleware/authenticate');
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Step 2: Add to Route
|
|
215
|
+
```javascript
|
|
216
|
+
// Before
|
|
217
|
+
router.get('/my-endpoint', async (req, res) => {
|
|
218
|
+
// Anyone can access
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// After
|
|
222
|
+
router.get('/my-endpoint', authenticate, async (req, res) => {
|
|
223
|
+
// Only authenticated users
|
|
224
|
+
const { walletAddress, userId } = req.user;
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Step 3: Add Ownership Check (if needed)
|
|
229
|
+
```javascript
|
|
230
|
+
router.put('/resource/:walletAddress', authenticate, async (req, res) => {
|
|
231
|
+
// Verify ownership
|
|
232
|
+
if (req.user.walletAddress !== req.params.walletAddress) {
|
|
233
|
+
return res.status(403).json({ error: 'Unauthorized' });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Process request
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## ๐งช Testing Protected Endpoints
|
|
243
|
+
|
|
244
|
+
### With curl
|
|
245
|
+
```bash
|
|
246
|
+
# 1. Login and save cookies
|
|
247
|
+
curl -X POST http://localhost:3001/auth/login \
|
|
248
|
+
-H "Content-Type: application/json" \
|
|
249
|
+
-d '{"walletAddress":"...","signature":"...","nonce":"...","message":"..."}' \
|
|
250
|
+
-c cookies.txt
|
|
251
|
+
|
|
252
|
+
# 2. Access protected endpoint
|
|
253
|
+
curl http://localhost:3001/auth/validate-session \
|
|
254
|
+
-b cookies.txt
|
|
255
|
+
|
|
256
|
+
# 3. Try without auth (should fail)
|
|
257
|
+
curl http://localhost:3001/auth/validate-session
|
|
258
|
+
# Returns: 401 Unauthorized
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### With Frontend
|
|
262
|
+
```typescript
|
|
263
|
+
// All protected endpoints work automatically
|
|
264
|
+
await apiService.updateUser(walletAddress, { username: 'newname' });
|
|
265
|
+
await apiService.completeOnboarding(walletAddress);
|
|
266
|
+
// JWT cookie sent automatically โ
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## ๐ Security Best Practices
|
|
272
|
+
|
|
273
|
+
### โ
Implemented
|
|
274
|
+
- [x] JWT authentication on sensitive endpoints
|
|
275
|
+
- [x] httpOnly cookies (XSS protection)
|
|
276
|
+
- [x] Wallet ownership verification
|
|
277
|
+
- [x] Session tracking in database
|
|
278
|
+
- [x] Token expiration (7 days)
|
|
279
|
+
- [x] CORS with credentials
|
|
280
|
+
- [x] Nonce-based signatures
|
|
281
|
+
|
|
282
|
+
### ๐ Recommended Next Steps
|
|
283
|
+
- [ ] Protect stats endpoints (or make them optionally public)
|
|
284
|
+
- [ ] Add rate limiting per user
|
|
285
|
+
- [ ] Add admin role for privileged operations
|
|
286
|
+
- [ ] Implement session revocation API
|
|
287
|
+
- [ ] Add IP-based session tracking
|
|
288
|
+
- [ ] Set up monitoring for failed auth attempts
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## ๐ Summary Table
|
|
293
|
+
|
|
294
|
+
| Category | Public | Protected | Total |
|
|
295
|
+
|----------|--------|-----------|-------|
|
|
296
|
+
| **Auth Endpoints** | 5 | 3 | 8 |
|
|
297
|
+
| **User Management** | 1 | 2 | 3 |
|
|
298
|
+
| **File Uploads** | 0 | 1 | 1 |
|
|
299
|
+
| **Stats** | 3 | 0 | 3 |
|
|
300
|
+
| **TOTAL** | 9 | 6 | 15 |
|
|
301
|
+
|
|
302
|
+
**Protection Rate:** 40% of endpoints require authentication
|
|
303
|
+
**With Wallet Verification:** 3 endpoints (50% of protected)
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## ๐ฏ Quick Reference
|
|
308
|
+
|
|
309
|
+
### Need Authentication?
|
|
310
|
+
- โ
Modifying user data
|
|
311
|
+
- โ
Uploading files
|
|
312
|
+
- โ
Accessing private info
|
|
313
|
+
- โ
Session management
|
|
314
|
+
|
|
315
|
+
### Can Be Public?
|
|
316
|
+
- โ
Registration/Login
|
|
317
|
+
- โ
Viewing public profiles
|
|
318
|
+
- โ
Public leaderboards
|
|
319
|
+
- โ
Public game stats
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
**Last Updated:** 2025-01-22
|
|
324
|
+
**Security Level:** โ
Production Ready
|
|
325
|
+
**Protected Endpoints:** 6/15 (40%)
|
|
326
|
+
|
|
327
|
+
|