275 lines
8.5 KiB
Markdown
275 lines
8.5 KiB
Markdown
# OAuth Implementation TODO
|
|
|
|
This document outlines the steps needed to implement OAuth 2.0 authentication for the Challonge API v2.1.
|
|
|
|
## Current Status
|
|
|
|
✅ **Completed:**
|
|
- API v2.1 service supports OAuth authentication (`AuthType.OAUTH`)
|
|
- UI toggle for OAuth is present in ChallongeTest.vue (disabled)
|
|
- Service client can accept Bearer tokens
|
|
|
|
🚧 **Not Implemented:**
|
|
- OAuth authorization flow
|
|
- Token storage and management
|
|
- Token refresh logic
|
|
- OAuth scope selection
|
|
|
|
## OAuth Flow Options
|
|
|
|
Challonge supports three OAuth flows. Choose based on your use case:
|
|
|
|
### 1. Authorization Code Flow (Recommended for Web Apps)
|
|
**Best for:** Browser-based applications where users can authorize access
|
|
|
|
**Steps to Implement:**
|
|
1. Register application at https://connect.challonge.com
|
|
- Get `client_id` and `client_secret`
|
|
- Set redirect URI (e.g., `http://localhost:5173/oauth/callback`)
|
|
|
|
2. Create OAuth authorization URL:
|
|
```javascript
|
|
const authUrl = `https://api.challonge.com/oauth/authorize?` +
|
|
`client_id=${CLIENT_ID}&` +
|
|
`redirect_uri=${REDIRECT_URI}&` +
|
|
`response_type=code&` +
|
|
`scope=me+tournaments:read+tournaments:write+matches:read+matches:write+participants:read+participants:write`;
|
|
```
|
|
|
|
3. Redirect user to authorization URL
|
|
4. Handle callback with authorization code
|
|
5. Exchange code for access token:
|
|
```javascript
|
|
POST https://api.challonge.com/oauth/token
|
|
Body: {
|
|
client_id, client_secret, grant_type: "authorization_code",
|
|
code, redirect_uri
|
|
}
|
|
```
|
|
|
|
6. Store access_token and refresh_token
|
|
7. Use access_token with API requests
|
|
|
|
### 2. Device Authorization Grant Flow
|
|
**Best for:** Devices with no browser or limited input (TVs, consoles, IoT)
|
|
|
|
**Steps:**
|
|
1. Request device code
|
|
2. Show QR code or user code to user
|
|
3. Poll for access token while user authorizes on their phone/PC
|
|
4. Store and use access token
|
|
|
|
### 3. Client Credentials Flow
|
|
**Best for:** Server-side applications managing their own tournaments
|
|
|
|
**Steps:**
|
|
1. Use client_id and client_secret to get application-scoped token
|
|
2. Access all tournaments created via your app
|
|
|
|
## Available OAuth Scopes
|
|
|
|
- `me` - Read user details
|
|
- `tournaments:read` - Read tournaments
|
|
- `tournaments:write` - Create/update/delete tournaments
|
|
- `matches:read` - Read matches
|
|
- `matches:write` - Update matches, report scores
|
|
- `participants:read` - Read participants
|
|
- `participants:write` - Add/update/remove participants
|
|
- `attachments:read` - Read match attachments
|
|
- `attachments:write` - Upload match attachments
|
|
- `communities:manage` - Access community resources
|
|
- `application:organizer` - Full access to user's resources for your app
|
|
- `application:player` - Read user's resources, register, report scores
|
|
- `application:manage` - Full access to all tournaments connected to your app
|
|
|
|
## Implementation Checklist
|
|
|
|
### Phase 1: OAuth Setup
|
|
- [ ] Register app at https://connect.challonge.com
|
|
- [ ] Store client_id in environment variables
|
|
- [ ] Store client_secret securely (backend only, never expose to frontend)
|
|
- [ ] Add OAuth callback route to Vue Router (`/oauth/callback`)
|
|
- [ ] Create OAuth configuration module
|
|
|
|
### Phase 2: Authorization Flow
|
|
- [ ] Create OAuth composable (`useChallongeOAuth.js`)
|
|
- [ ] Implement authorization URL generation
|
|
- [ ] Create "Sign in with Challonge" button
|
|
- [ ] Handle OAuth redirect and code extraction
|
|
- [ ] Implement token exchange (requires backend proxy for client_secret)
|
|
|
|
### Phase 3: Token Management
|
|
- [ ] Create secure token storage (localStorage for access token)
|
|
- [ ] Implement token refresh logic
|
|
- [ ] Check token expiration before requests
|
|
- [ ] Auto-refresh expired tokens
|
|
- [ ] Handle refresh token failure (re-authorize user)
|
|
|
|
### Phase 4: API Key Manager Integration
|
|
- [ ] Update `useChallongeApiKey` composable to support OAuth tokens
|
|
- [ ] Add OAuth token storage alongside API keys
|
|
- [ ] Create OAuth setup wizard in API Key Manager
|
|
- [ ] Show token expiration date and refresh status
|
|
- [ ] Allow users to revoke OAuth access
|
|
|
|
### Phase 5: UI Updates
|
|
- [ ] Enable OAuth toggle in ChallongeTest.vue
|
|
- [ ] Add OAuth status indicator (connected/disconnected)
|
|
- [ ] Show current OAuth scopes
|
|
- [ ] Add "Connect with OAuth" button
|
|
- [ ] Add "Disconnect OAuth" button
|
|
- [ ] Show which permissions are granted
|
|
|
|
### Phase 6: Scope Management
|
|
- [ ] Create scope selection UI
|
|
- [ ] Allow users to request specific scopes
|
|
- [ ] Show which features require which scopes
|
|
- [ ] Handle insufficient permission errors gracefully
|
|
|
|
### Phase 7: Testing
|
|
- [ ] Test authorization flow (desktop browser)
|
|
- [ ] Test authorization flow (mobile browser)
|
|
- [ ] Test token refresh
|
|
- [ ] Test expired token handling
|
|
- [ ] Test with different scope combinations
|
|
- [ ] Test OAuth + API v1 key fallback
|
|
- [ ] Test concurrent sessions (multiple tabs)
|
|
|
|
## Security Considerations
|
|
|
|
### Client Secret Protection
|
|
⚠️ **CRITICAL**: Never expose `client_secret` in frontend code!
|
|
|
|
**Solution:** Implement backend proxy for token exchange:
|
|
```javascript
|
|
// Frontend requests token from your backend
|
|
POST /api/oauth/token
|
|
Body: { code, redirect_uri }
|
|
|
|
// Your backend exchanges code with Challonge
|
|
POST https://api.challonge.com/oauth/token
|
|
Body: { client_id, client_secret, code, ... }
|
|
```
|
|
|
|
### Token Storage
|
|
- ✅ **Access Token**: Can store in localStorage (limited lifetime)
|
|
- ⚠️ **Refresh Token**: More sensitive, consider httpOnly cookies or secure backend storage
|
|
- ❌ **Client Secret**: Never in frontend
|
|
|
|
### PKCE (Proof Key for Code Exchange)
|
|
Consider implementing PKCE for additional security:
|
|
- Generate `code_verifier` (random string)
|
|
- Create `code_challenge` (SHA256 hash of verifier)
|
|
- Send challenge with authorization request
|
|
- Send verifier with token request
|
|
- Prevents authorization code interception attacks
|
|
|
|
## Backend Requirements
|
|
|
|
To properly implement OAuth, you need a backend proxy for:
|
|
|
|
1. **Token Exchange** (requires client_secret)
|
|
2. **Token Refresh** (requires client_secret)
|
|
3. **Secure Storage** (optional, for refresh tokens)
|
|
|
|
### Minimal Backend Example (Node.js/Express)
|
|
```javascript
|
|
app.post('/api/oauth/token', async (req, res) => {
|
|
const { code, redirect_uri } = req.body;
|
|
|
|
const response = await fetch('https://api.challonge.com/oauth/token', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
body: new URLSearchParams({
|
|
client_id: process.env.CHALLONGE_CLIENT_ID,
|
|
client_secret: process.env.CHALLONGE_CLIENT_SECRET,
|
|
grant_type: 'authorization_code',
|
|
code,
|
|
redirect_uri
|
|
})
|
|
});
|
|
|
|
const tokens = await response.json();
|
|
res.json(tokens);
|
|
});
|
|
```
|
|
|
|
### Alternative: Serverless Functions
|
|
Can use:
|
|
- Netlify Functions
|
|
- Vercel Edge Functions
|
|
- Cloudflare Workers
|
|
- AWS Lambda
|
|
|
|
## Token Response Format
|
|
|
|
```json
|
|
{
|
|
"access_token": "long-access-token-string",
|
|
"token_type": "Bearer",
|
|
"expires_in": 604800,
|
|
"refresh_token": "long-refresh-token-string",
|
|
"scope": "me tournaments:read tournaments:write ...",
|
|
"created_at": 1623246724
|
|
}
|
|
```
|
|
|
|
**Note:** `expires_in` is in seconds (604800 = 1 week)
|
|
|
|
## Refresh Token Usage
|
|
|
|
When access token expires:
|
|
```javascript
|
|
POST https://api.challonge.com/oauth/token
|
|
Body: {
|
|
client_id,
|
|
client_secret,
|
|
grant_type: "refresh_token",
|
|
refresh_token: "your-refresh-token"
|
|
}
|
|
```
|
|
|
|
Response includes new `access_token` and optionally a new `refresh_token`.
|
|
|
|
## Migration Path
|
|
|
|
Users with API v1 keys can continue using them with v2.1 API:
|
|
1. API v1 keys work with `Authorization-Type: v1` header
|
|
2. No migration required for existing users
|
|
3. OAuth is optional but recommended for:
|
|
- Better security (scoped permissions)
|
|
- Acting on behalf of other users
|
|
- Building multi-user applications
|
|
|
|
## Resources
|
|
|
|
- [Challonge API Documentation](https://challonge.apidog.io/getting-started-1726706m0)
|
|
- [Authorization Guide](https://challonge.apidog.io/authorization-1726705m0)
|
|
- [Developer Portal](https://connect.challonge.com/)
|
|
- [OAuth 2.0 RFC](https://datatracker.ietf.org/doc/html/rfc6749)
|
|
|
|
## Estimated Implementation Time
|
|
|
|
- **Phase 1 (Setup):** 1-2 hours
|
|
- **Phase 2 (Auth Flow):** 3-4 hours
|
|
- **Phase 3 (Token Management):** 2-3 hours
|
|
- **Phase 4 (API Integration):** 2-3 hours
|
|
- **Phase 5-6 (UI):** 3-4 hours
|
|
- **Phase 7 (Testing):** 2-3 hours
|
|
|
|
**Total:** ~15-20 hours for full OAuth implementation
|
|
|
|
## Priority
|
|
|
|
📅 **Medium Priority** - API v1 keys work fine with v2.1 API. Implement OAuth when:
|
|
- Building features that require user-specific access
|
|
- Need to act on behalf of multiple users
|
|
- Want better security with scoped permissions
|
|
- Challonge announces v1 key deprecation
|
|
|
|
---
|
|
|
|
**Status:** Not started
|
|
**Last Updated:** 2026-01-28
|
|
**Assigned To:** Future development
|