168 lines
5.8 KiB
Markdown
168 lines
5.8 KiB
Markdown
# Authentication Setup
|
|
|
|
This document outlines how to configure authentication for Spotizerr, including both traditional username/password authentication and SSO (Single Sign-On) with Google and GitHub.
|
|
|
|
## Environment Variables
|
|
|
|
### Basic Authentication
|
|
- `ENABLE_AUTH`: Enable/disable authentication system (default: false)
|
|
- `DISABLE_REGISTRATION`: Disable public registration (default: false)
|
|
- `JWT_SECRET`: Secret key for JWT token signing (required in production)
|
|
- `JWT_ALGORITHM`: JWT algorithm (default: HS256)
|
|
- `JWT_EXPIRATION_HOURS`: JWT token expiration time in hours (default: 24)
|
|
- `DEFAULT_ADMIN_USERNAME`: Default admin username (default: admin)
|
|
- `DEFAULT_ADMIN_PASSWORD`: Default admin password (default: admin123)
|
|
|
|
### SSO Configuration
|
|
- `SSO_ENABLED`: Enable/disable SSO functionality (default: true)
|
|
- `SSO_BASE_REDIRECT_URI`: Base redirect URI for SSO callbacks (default: http://localhost:8000/api/auth/sso/callback)
|
|
- `FRONTEND_URL`: Frontend URL for post-authentication redirects (default: http://localhost:3000)
|
|
|
|
#### Google SSO
|
|
- `GOOGLE_CLIENT_ID`: Google OAuth2 client ID
|
|
- `GOOGLE_CLIENT_SECRET`: Google OAuth2 client secret
|
|
|
|
#### GitHub SSO
|
|
- `GITHUB_CLIENT_ID`: GitHub OAuth2 client ID
|
|
- `GITHUB_CLIENT_SECRET`: GitHub OAuth2 client secret
|
|
|
|
## Setup Instructions
|
|
|
|
### 1. Traditional Authentication Only
|
|
|
|
1. Set environment variables:
|
|
```bash
|
|
ENABLE_AUTH=true
|
|
JWT_SECRET=your-super-secret-jwt-key-change-in-production
|
|
DEFAULT_ADMIN_USERNAME=admin
|
|
DEFAULT_ADMIN_PASSWORD=your-secure-password
|
|
```
|
|
|
|
2. Start the application - a default admin user will be created automatically.
|
|
|
|
### 2. Google SSO Setup
|
|
|
|
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
2. Create a new project or select existing one
|
|
3. Enable Google+ API
|
|
4. Go to "Credentials" → "Create Credentials" → "OAuth 2.0 Client IDs"
|
|
5. Configure OAuth consent screen with your application details
|
|
6. Set authorized redirect URIs:
|
|
- `http://localhost:8000/api/auth/sso/callback/google` (development)
|
|
- `https://yourdomain.com/api/auth/sso/callback/google` (production)
|
|
7. Copy Client ID and Client Secret to environment variables:
|
|
|
|
```bash
|
|
GOOGLE_CLIENT_ID=your-google-client-id
|
|
GOOGLE_CLIENT_SECRET=your-google-client-secret
|
|
```
|
|
|
|
### 3. GitHub SSO Setup
|
|
|
|
1. Go to GitHub Settings → Developer settings → OAuth Apps
|
|
2. Click "New OAuth App"
|
|
3. Fill in application details:
|
|
- Application name: Your app name
|
|
- Homepage URL: Your app URL
|
|
- Authorization callback URL:
|
|
- `http://localhost:8000/api/auth/sso/callback/github` (development)
|
|
- `https://yourdomain.com/api/auth/sso/callback/github` (production)
|
|
4. Copy Client ID and Client Secret to environment variables:
|
|
|
|
```bash
|
|
GITHUB_CLIENT_ID=your-github-client-id
|
|
GITHUB_CLIENT_SECRET=your-github-client-secret
|
|
```
|
|
|
|
### 4. Complete Environment Configuration
|
|
|
|
Create a `.env` file with all required variables:
|
|
|
|
```bash
|
|
# Basic Authentication
|
|
ENABLE_AUTH=true
|
|
JWT_SECRET=your-super-secret-jwt-key-change-in-production
|
|
JWT_EXPIRATION_HOURS=24
|
|
DEFAULT_ADMIN_USERNAME=admin
|
|
DEFAULT_ADMIN_PASSWORD=your-secure-password
|
|
|
|
# SSO Configuration
|
|
SSO_ENABLED=true
|
|
SSO_BASE_REDIRECT_URI=http://localhost:8000/api/auth/sso/callback
|
|
FRONTEND_URL=http://localhost:3000
|
|
|
|
# Google SSO (optional)
|
|
GOOGLE_CLIENT_ID=your-google-client-id
|
|
GOOGLE_CLIENT_SECRET=your-google-client-secret
|
|
|
|
# GitHub SSO (optional)
|
|
GITHUB_CLIENT_ID=your-github-client-id
|
|
GITHUB_CLIENT_SECRET=your-github-client-secret
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication Status
|
|
- `GET /api/auth/status` - Get authentication status and available SSO providers
|
|
|
|
### Traditional Authentication
|
|
- `POST /api/auth/login` - Login with username/password
|
|
- `POST /api/auth/register` - Register new user (if enabled)
|
|
- `POST /api/auth/logout` - Logout current user
|
|
|
|
### SSO Authentication
|
|
- `GET /api/auth/sso/status` - Get SSO status and providers
|
|
- `GET /api/auth/sso/login/google` - Initiate Google SSO login
|
|
- `GET /api/auth/sso/login/github` - Initiate GitHub SSO login
|
|
- `GET /api/auth/sso/callback/google` - Google SSO callback (automatic)
|
|
- `GET /api/auth/sso/callback/github` - GitHub SSO callback (automatic)
|
|
- `POST /api/auth/sso/unlink/{provider}` - Unlink SSO provider from account
|
|
|
|
### User Management (Admin only)
|
|
- `GET /api/auth/users` - List all users
|
|
- `POST /api/auth/users/create` - Create new user
|
|
- `DELETE /api/auth/users/{username}` - Delete user
|
|
- `PUT /api/auth/users/{username}/role` - Update user role
|
|
|
|
## Security Considerations
|
|
|
|
1. **HTTPS in Production**: Always use HTTPS in production and set `allow_insecure_http=False`
|
|
2. **Secure JWT Secret**: Use a strong, randomly generated JWT secret
|
|
3. **Environment Variables**: Never commit sensitive credentials to version control
|
|
4. **CORS Configuration**: Configure CORS appropriately for your frontend domain
|
|
5. **Cookie Security**: Ensure secure cookie settings in production
|
|
|
|
## User Types
|
|
|
|
The system supports two types of users:
|
|
|
|
1. **Traditional Users**: Created via username/password registration or admin creation
|
|
2. **SSO Users**: Created automatically when users authenticate via Google or GitHub
|
|
|
|
SSO users:
|
|
- Have `sso_provider` and `sso_id` fields populated
|
|
- Cannot use password-based authentication
|
|
- Can be unlinked from SSO providers by admins
|
|
- Get `user` role by default (first user gets `admin` role)
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **SSO Login Fails**
|
|
- Check OAuth app configuration in Google/GitHub
|
|
- Verify redirect URIs match exactly
|
|
- Ensure client ID and secret are correct
|
|
|
|
2. **CORS Errors**
|
|
- Configure CORS middleware to allow your frontend domain
|
|
- Check if frontend and backend URLs match configuration
|
|
|
|
3. **JWT Token Issues**
|
|
- Verify JWT_SECRET is set and consistent
|
|
- Check token expiration time
|
|
- Ensure clock synchronization between services
|
|
|
|
4. **SSO Module Not Available**
|
|
- Install fastapi-sso: `pip install fastapi-sso==0.18.0`
|
|
- Restart the application after installation |