10 KiB
Real Client Testing Cheat Sheet
Quick guide to test Gondulf with real IndieAuth clients. Target: working auth in 15-30 minutes.
1. Quick Start Setup
Generate Secret Key
python -c "import secrets; print(secrets.token_urlsafe(32))"
Create .env File
cd /path/to/gondulf
cp .env.example .env
Edit .env with minimum required settings:
# Required - paste your generated key
GONDULF_SECRET_KEY=your-generated-secret-key-here
# Your auth server URL (use your actual domain)
GONDULF_BASE_URL=https://auth.thesatelliteoflove.com
# Database (container path)
GONDULF_DATABASE_URL=sqlite:////data/gondulf.db
# SMTP - use your provider (example: Gmail)
GONDULF_SMTP_HOST=smtp.gmail.com
GONDULF_SMTP_PORT=587
GONDULF_SMTP_USERNAME=your-email@gmail.com
GONDULF_SMTP_PASSWORD=your-app-specific-password
GONDULF_SMTP_FROM=your-email@gmail.com
GONDULF_SMTP_USE_TLS=true
# Production settings
GONDULF_HTTPS_REDIRECT=true
GONDULF_TRUST_PROXY=true
GONDULF_SECURE_COOKIES=true
GONDULF_DEBUG=false
Run with Podman/Docker
# Build
podman build -t gondulf:latest -f Containerfile .
# Run (creates volume for persistence)
podman run -d \
--name gondulf \
-p 8000:8000 \
-v gondulf_data:/data \
--env-file .env \
gondulf:latest
# Or with docker-compose/podman-compose
podman-compose up -d
Verify Server Running
curl https://auth.thesatelliteoflove.com/health
# Expected: {"status":"healthy","database":"connected"}
curl https://auth.thesatelliteoflove.com/.well-known/oauth-authorization-server
# Expected: JSON with authorization_endpoint, token_endpoint, etc.
2. Domain Setup
DNS TXT Record
Add this TXT record to your domain DNS:
| Type | Host | Value |
|---|---|---|
| TXT | @ (or thesatelliteoflove.com) | gondulf-verify-domain |
Verify with:
dig TXT thesatelliteoflove.com +short
# Expected: "gondulf-verify-domain"
Note: DNS propagation can take up to 48 hours, but usually completes within minutes.
Homepage rel="me" Link
Add a rel="me" link to your homepage pointing to your email:
<!DOCTYPE html>
<html>
<head>
<title>Your Homepage</title>
<!-- rel="me" link in head -->
<link rel="me" href="mailto:you@thesatelliteoflove.com">
</head>
<body>
<h1>thesatelliteoflove.com</h1>
<!-- Or as a visible link in body -->
<a rel="me" href="mailto:you@thesatelliteoflove.com">Email me</a>
</body>
</html>
Important: The email domain should match your website domain OR be an email you control (Gondulf sends a verification code to this address).
Complete Homepage Example
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>thesatelliteoflove.com</title>
<link rel="me" href="mailto:phil@thesatelliteoflove.com">
<link rel="authorization_endpoint" href="https://auth.thesatelliteoflove.com/authorize">
<link rel="token_endpoint" href="https://auth.thesatelliteoflove.com/token">
</head>
<body>
<div class="h-card">
<h1 class="p-name">Phil</h1>
<p><a class="u-url" rel="me" href="https://thesatelliteoflove.com/">thesatelliteoflove.com</a></p>
<p><a rel="me" href="mailto:phil@thesatelliteoflove.com">phil@thesatelliteoflove.com</a></p>
</div>
</body>
</html>
3. Testing with Real Clients
Important: These are IndieAuth CLIENTS that will authenticate against YOUR Gondulf server. Your domain needs to point its authorization and token endpoints to Gondulf, not to IndieLogin.
Note about IndieLogin.com: IndieLogin.com is NOT a client - it's an IndieAuth provider/server like Gondulf. Gondulf is designed to REPLACE IndieLogin as your authentication provider. If your domain points to IndieLogin's endpoints, you're using IndieLogin for auth, not Gondulf.
Option A: IndieWeb Wiki (Easiest Test)
The IndieWeb wiki uses IndieAuth for login.
- Go to: https://indieweb.org/
- Click "Log in" (top right)
- Enter your domain:
https://thesatelliteoflove.com/ - Click "Log In"
Expected flow:
- Wiki discovers your authorization endpoint (Gondulf)
- Redirects to your Gondulf server
- Gondulf verifies DNS TXT record
- Gondulf discovers your email from rel="me"
- Sends verification code to your email
- You enter the code
- Consent screen appears
- Approve authorization
- Redirected back to IndieWeb wiki as logged in
Option B: Quill (Micropub Posting Client)
Quill is a web-based Micropub client for creating posts.
- Go to: https://quill.p3k.io/
- Enter your domain:
https://thesatelliteoflove.com/ - Click "Sign In"
Note: Quill will attempt to discover your Micropub endpoint after auth. For testing auth only, you can ignore Micropub errors after successful authentication.
Option C: Monocle (Feed Reader)
Monocle is a web-based social feed reader.
- Go to: https://monocle.p3k.io/
- Enter your domain:
https://thesatelliteoflove.com/ - Sign in
Note: Monocle will look for a Microsub endpoint after auth. The authentication itself will still work without one.
Option D: Teacup (Check-in App)
Teacup is for food/drink check-ins.
- Go to: https://teacup.p3k.io/
- Enter your domain to sign in
Option E: Micropublish (Simple Posting)
Micropublish is a simple web interface for creating posts.
- Go to: https://micropublish.net/
- Enter your domain to authenticate
Option F: Indigenous (Mobile Apps)
Indigenous has apps for iOS and Android that support IndieAuth.
- iOS: Search "Indigenous" in App Store
- Android: Search "Indigenous" in Play Store
- Configure with your domain:
https://thesatelliteoflove.com/
Option G: Omnibear (Browser Extension)
Omnibear is a browser extension for Firefox and Chrome.
- Install from browser extension store
- Configure with your domain
- Use to sign in and post from any webpage
Option H: Custom Test Client (curl)
Test the authorization endpoint directly:
# Generate PKCE verifier and challenge
CODE_VERIFIER=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
CODE_CHALLENGE=$(echo -n "$CODE_VERIFIER" | openssl dgst -sha256 -binary | base64 | tr '+/' '-_' | tr -d '=')
echo "Verifier: $CODE_VERIFIER"
echo "Challenge: $CODE_CHALLENGE"
# Open this URL in browser:
echo "https://auth.thesatelliteoflove.com/authorize?\
client_id=https://example.com/&\
redirect_uri=https://example.com/callback&\
response_type=code&\
state=test123&\
code_challenge=$CODE_CHALLENGE&\
code_challenge_method=S256&\
me=https://thesatelliteoflove.com/"
4. Verification Checklist
DNS Verification
# Check TXT record exists
dig TXT thesatelliteoflove.com +short
# Must return: "gondulf-verify-domain"
# Alternative: query specific DNS server
dig @8.8.8.8 TXT thesatelliteoflove.com +short
Email Discovery Verification
# Check your homepage serves rel="me" email link
curl -s https://thesatelliteoflove.com/ | grep -i 'rel="me"'
# Must show: href="mailto:your@email.com"
# Or check with a parser
curl -s https://thesatelliteoflove.com/ | grep -oP 'rel="me"[^>]*href="mailto:[^"]+"'
Server Metadata Verification
curl -s https://auth.thesatelliteoflove.com/.well-known/oauth-authorization-server | jq .
Expected output:
{
"issuer": "https://auth.thesatelliteoflove.com",
"authorization_endpoint": "https://auth.thesatelliteoflove.com/authorize",
"token_endpoint": "https://auth.thesatelliteoflove.com/token",
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code"],
"code_challenge_methods_supported": [],
"token_endpoint_auth_methods_supported": ["none"],
"revocation_endpoint_auth_methods_supported": ["none"],
"scopes_supported": []
}
Complete Flow Test
- DNS check passes (TXT record found)
- Email discovered (rel="me" link found)
- Verification email received
- Code entered successfully
- Consent screen displayed
- Authorization code returned
- Token exchanged successfully
- Client shows logged in as
https://thesatelliteoflove.com/
5. Troubleshooting
Check Server Logs
# View live logs
podman logs -f gondulf
# View last 100 lines
podman logs --tail 100 gondulf
Enable Debug Mode (Development Only)
In .env:
GONDULF_DEBUG=true
GONDULF_LOG_LEVEL=DEBUG
GONDULF_HTTPS_REDIRECT=false
Warning: Never use DEBUG=true in production.
Common Issues
| Problem | Solution |
|---|---|
| "dns_verification_failed" | Add TXT record: gondulf-verify-domain. Wait for DNS propagation (check with dig). |
| "email_discovery_failed" | Add <link rel="me" href="mailto:you@domain.com"> to your homepage. |
| "email_send_failed" | Check SMTP settings. Test with: `podman logs gondulf |
| "Invalid me URL" | Ensure me parameter uses HTTPS and is a valid URL |
| "client_id must use HTTPS" | Client applications must use HTTPS URLs |
| "redirect_uri does not match" | redirect_uri domain must match client_id domain |
| Health check fails | Check database volume permissions: podman exec gondulf ls -la /data |
| Container won't start | Check for missing env vars: podman logs gondulf |
SMTP Testing
Test email delivery independently:
# Check SMTP connection (Python)
python -c "
import smtplib
with smtplib.SMTP('smtp.gmail.com', 587) as s:
s.starttls()
s.login('your-email@gmail.com', 'app-password')
print('SMTP connection successful')
"
DNS Propagation Check
# Check multiple DNS servers
for ns in 8.8.8.8 1.1.1.1 9.9.9.9; do
echo "Checking $ns:"
dig @$ns TXT thesatelliteoflove.com +short
done
Database Issues
# Check database exists and is writable
podman exec gondulf ls -la /data/
# Check database schema
podman exec gondulf sqlite3 /data/gondulf.db ".tables"
Quick Reference
| Endpoint | URL |
|---|---|
| Health | GET /health |
| Metadata | GET /.well-known/oauth-authorization-server |
| Authorization | GET /authorize |
| Token | POST /token |
| Start Verification | POST /api/verify/start |
| Verify Code | POST /api/verify/code |
| Required DNS Record | Value |
|---|---|
| TXT @ | gondulf-verify-domain |
| Required HTML | Example |
|---|---|
| rel="me" email | <link rel="me" href="mailto:you@example.com"> |
| authorization_endpoint | <link rel="authorization_endpoint" href="https://auth.example.com/authorize"> |
| token_endpoint | <link rel="token_endpoint" href="https://auth.example.com/token"> |