Overview
Weaver’s OAuth implementation (pkg/auth/oauth.go) provides:- Browser-based flow: Opens browser for user authentication
- Device code flow: For headless/remote environments
- PKCE support: Enhanced security for public clients
- Token refresh: Automatic access token renewal
- Multi-provider: Support for OpenAI, GitHub Copilot, and custom OAuth providers
OAuth Architecture
Weaver implements the OAuth 2.0 Authorization Code flow with PKCE:Authentication Methods
Weaver provides three OAuth authentication flows:1. Browser-Based Authentication
Best for interactive environments with a web browser.Generate PKCE Codes
From pkg/auth/pkce.go:14:This creates:
code_verifier: Random 64-byte stringcode_challenge: SHA256 hash of verifier
Start Local Callback Server
From pkg/auth/oauth.go:64:Weaver starts a local HTTP server on port 1455 (or configured port) to receive the OAuth callback.
2. Device Code Flow
For headless environments (servers, SSH sessions).3. Token Paste (Fallback)
For environments where OAuth is not available. From pkg/auth/token.go:10:Token Management
Credential Storage
From pkg/auth/oauth.go:365:Token Refresh
From pkg/auth/oauth.go:261:JWT Parsing
Extract account information from ID tokens (pkg/auth/oauth.go:385):Provider Configuration
OpenAI OAuth
From pkg/auth/oauth.go:29:GitHub Copilot OAuth
Configure in config.json:Custom Provider
Define your own OAuth provider:Usage Examples
Command-Line Authentication
Programmatic Usage
Security Considerations
PKCE Protection
PKCE Protection
Weaver uses PKCE (RFC 7636) to prevent authorization code interception:
code_verifier: Kept secret on clientcode_challenge: Sent to authorization servercode_challenge_method: SHA256 hashing
State Parameter
State Parameter
From pkg/auth/oauth.go:39:64-character random state prevents CSRF attacks.
Local Callback Server
Local Callback Server
- Binds to
127.0.0.1only (not0.0.0.0) - Shuts down immediately after receiving callback
- 5-minute timeout to prevent hanging
- HTML response confirms success
Token Storage
Token Storage
- Credentials stored in
~/.weaver/auth/ - File permissions: 0600 (owner read/write only)
- Refresh tokens enable long-term access
- Access tokens expire (typically 1 hour)
Troubleshooting
Browser Doesn't Open
Browser Doesn't Open
Manually open the URL displayed in terminal:Or use device code flow:
State Mismatch Error
State Mismatch Error
Possible causes:
- Multiple authentication attempts
- Browser cached old redirect
- Network proxy interference
Port Already in Use
Port Already in Use
If port 1455 is occupied:
Token Refresh Failed
Token Refresh Failed
If refresh token is invalid or expired:Re-authenticate to obtain new tokens.
Best Practices
Use OAuth Over API Keys
Use OAuth Over API Keys
OAuth provides:
- Shorter-lived access tokens
- Automatic token refresh
- Account-level access control
- Revocation capabilities
Secure Token Storage
Secure Token Storage
- Never commit credentials to version control
- Use file permissions 0600 for auth files
- Rotate credentials regularly
- Revoke tokens when no longer needed
Handle Token Expiration
Handle Token Expiration
Always check
ExpiresAt before API calls:Device Code for Servers
Device Code for Servers
Use device code flow for:
- Headless servers
- SSH sessions
- Docker containers
- CI/CD pipelines
Next Steps
- Configure OAuth providers in config.json
- Deploy with Docker using OAuth credentials
- Set up Multi-Channel authentication