9.6 KiB
🌐 File Protocol Testing Guide
Overview
This guide explains how to use the test client (test-client.html) when opened directly from your filesystem (file:// protocol) instead of through a web server.
🔑 The Authentication Challenge
When you open test-client.html directly from your filesystem:
- The file runs with
file://protocol (e.g.,file:///C:/Users/you/TurboTrades/test-client.html) - Cookies set by
http://localhost:3000are not accessible fromfile:// - You must use Bearer token authentication instead of cookies
✅ How to Authenticate
Step 1: Login via Steam
-
Open your browser and navigate to:
http://localhost:3000/auth/steam -
Complete Steam OAuth login
- You'll be redirected to Steam
- Authorize the application
- You'll be redirected back
-
Get your access token
- After successful login, navigate to:
http://localhost:3000/auth/decode-token- Copy the entire
accessTokenvalue from the JSON response
Alternative: Extract from Browser Console
// Open browser console (F12) on http://localhost:3000
document.cookie.split('; ').find(row => row.startsWith('accessToken=')).split('=')[1]
Step 2: Use Token in Test Client
-
Open the test client:
Double-click: test-client.html -
Paste your token:
- Find the "Access Token (optional)" field in the Connection section
- Paste your full JWT token (starts with
eyJhbGciOiJIUzI1NiIs...)
-
Verify authentication:
- Click "🔄 Check Auth Status" button in the Authentication Status section
- You should see: ✅ Authenticated with your username and Steam ID
🧪 What Works Now
With your token pasted, you can use all authenticated features:
✅ WebSocket Connection
- Connect with token in URL parameter
- Receive authenticated welcome message
- Server identifies you by Steam ID
✅ Marketplace APIs
- Create Listing (POST /marketplace/listings)
- Update Price (PATCH /marketplace/listings/:id/price)
- Get Listings (GET /marketplace/listings) - with user-specific data
✅ User APIs
- Set Trade URL (PUT /user/trade-url)
- Update Email (PATCH /user/email)
- Get Profile (GET /user/profile)
- Get Balance (GET /user/balance)
- Get Stats (GET /user/stats)
🔍 How It Works
API Request Flow
-
Test client reads token from input field:
const token = document.getElementById("token").value; -
Adds Authorization header to requests:
headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json" } -
Server validates token:
// Server checks Authorization header first const authHeader = request.headers.authorization; if (authHeader && authHeader.startsWith("Bearer ")) { token = authHeader.substring(7); } // Falls back to cookies if no header if (!token && request.cookies.accessToken) { token = request.cookies.accessToken; } -
Request succeeds with user context
🎯 Quick Start Example
Example: Create a Listing
-
Login and get token (see Step 1 above)
Your token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOi... -
Open test-client.html
-
Paste token in "Access Token" field
-
Click "Check Auth Status"
- Should show: ✅ Authenticated as [Your Name]
-
Set your Trade URL (if not set):
- Get from: Steam → Inventory → Trade Offers → "Who can send me trade offers?"
- Format:
https://steamcommunity.com/tradeoffer/new/?partner=XXXXX&token=XXXXX - Click "Set Trade URL"
-
Create a listing:
- Item Name: "AK-47 | Redline"
- Game: CS2
- Price: 45.99
- Click "Create Listing (Requires Auth)"
-
Success! ✅
- You'll get a success message
- WebSocket will broadcast the new listing to all connected clients
🐛 Troubleshooting
"No access token provided" Error
Problem: Token not being sent with request
Solutions:
- Check token is pasted in "Access Token" field
- Click "Check Auth Status" to verify
- Token must be the full JWT (starts with
eyJhbGci...) - Token expires after 15 minutes - get a new one
"Invalid access token" Error
Problem: Token is expired or malformed
Solutions:
- Login again to get a fresh token
- Copy the entire token (no spaces or line breaks)
- Check token hasn't expired (15 minute lifespan)
"Trade URL must be set" Error
Problem: Trying to create listing without trade URL
Solutions:
- Set your trade URL first using the "Set Trade URL" section
- Get your trade URL from Steam:
- Steam → Inventory → Trade Offers
- "Who can send me trade offers?"
- Copy the URL
Authentication Status Shows "Not Authenticated"
Problem: Token not recognized or not present
Solutions:
- Make sure you pasted the token in the "Access Token" field
- Click "Check Auth Status" button
- If still failing, get a new token (it may have expired)
- Check browser console for specific error messages
📊 Token Information
Your Current Token
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2OTYxMzRlOTIwNzYxOTc3ZGNjMWQ2ZDIiLCJzdGVhbUlkIjoiNzY1NjExOTgwMjc2MDgwNzEiLCJ1c2VybmFtZSI6IuKchSBBc2hsZXkg44Ki44K344Ol44Oq44O8IiwiYXZhdGFyIjoiaHR0cHM6Ly9hdmF0YXJzLnN0ZWFtc3RhdGljLmNvbS9kNmI2MTY0NjQ2MjlkYjIxNjcwYTQ0NTY3OWFlZmVlYjE4ZmI0MDFmX2Z1bGwuanBnIiwic3RhZmZMZXZlbCI6MCwiaWF0IjoxNzY3OTk0MzkwLCJleHAiOjE3Njc5OTUyOTAsImF1ZCI6InR1cmJvdHJhZGVzLWFwaSIsImlzcyI6InR1cmJvdHJhZGVzIn0.9Xh-kDvWZbQERuXgRb-NEMw6il2h8SQyVQySdILcLo8
User ID: 696134e92076197...[truncated]
Steam ID: 76561198027608071
Username: ✅ Ashley アシュリー
Staff Level: 0
Issued At: 1767994390 (Unix timestamp)
Expires At: 1767995290 (Unix timestamp - 15 minutes from issue)
Token Lifespan
- Access Token: 15 minutes
- Refresh Token: 7 days (stored in cookies, not available in file:// protocol)
When Token Expires
- Navigate to
http://localhost:3000/auth/steamagain - You'll be automatically logged in (Steam session still active)
- Get new token from
/auth/decode-token - Paste new token in test client
🎓 Advanced Tips
Save Token Temporarily
// In browser console on test client page
localStorage.setItem('authToken', 'YOUR_TOKEN_HERE');
// Load it later
const token = localStorage.getItem('authToken');
document.getElementById('token').value = token;
Check Token Expiry
// Decode JWT (client-side, no verification)
function parseJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(atob(base64).split('').map(c => {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
const decoded = parseJwt(YOUR_TOKEN);
const expiresAt = new Date(decoded.exp * 1000);
console.log('Token expires at:', expiresAt);
Auto-Refresh Before Expiry
// Set up auto-refresh 1 minute before expiry
const decoded = parseJwt(token);
const expiresIn = (decoded.exp * 1000) - Date.now();
const refreshTime = expiresIn - 60000; // 1 minute before
if (refreshTime > 0) {
setTimeout(() => {
alert('Token expiring soon! Please get a new token.');
}, refreshTime);
}
🌐 Alternative: Use a Web Server
If you prefer cookie-based authentication:
Option 1: Simple HTTP Server (Python)
cd TurboTrades
python -m http.server 8000
Then open: http://localhost:8000/test-client.html
Option 2: Node.js HTTP Server
cd TurboTrades
npx http-server -p 8000
Then open: http://localhost:8000/test-client.html
Option 3: VS Code Live Server
- Install "Live Server" extension
- Right-click
test-client.html - Select "Open with Live Server"
Note: With a web server, cookies will work and you don't need to paste tokens!
📋 Testing Checklist
With Token Authentication (file:// protocol)
- Login via Steam
- Get access token
- Paste token in test client
- Check auth status (should show ✅)
- Connect WebSocket with token
- Set trade URL
- Create listing
- Update listing price
- Get listings
- Verify WebSocket broadcasts received
🔐 Security Notes
Token Security
- ✅ Token is sent via HTTPS in production
- ✅ Token expires after 15 minutes
- ✅ Token is JWT signed and verified server-side
- ⚠️ Don't share your token with others
- ⚠️ Don't commit tokens to version control
File Protocol Limitations
- ❌ Cookies don't work across protocols
- ❌ Can't access localStorage from different origin
- ✅ Authorization header works perfectly
- ✅ CORS configured to allow file:// protocol
📚 Related Documentation
- WEBSOCKET_AUTH.md - WebSocket authentication details
- TESTING_GUIDE.md - Comprehensive testing guide
- TEST_CLIENT_REFERENCE.md - Quick reference for test client
- NEW_FEATURES.md - Latest features and enhancements
💡 Summary
File Protocol Testing Flow:
- Login via
http://localhost:3000/auth/steam - Get token from
/auth/decode-token - Paste token in test client "Access Token" field
- Click "Check Auth Status"
- Use all authenticated features! 🎉
Key Points:
- Token authentication works from
file://protocol - Token lasts 15 minutes
- Server accepts
Authorization: Bearer <token>header - All API requests automatically include your token
- WebSocket can use token via query parameter
You're all set! Happy testing! 🚀