This fixes critical IndieAuth authentication by implementing PKCE (Proof Key for Code Exchange) as required by IndieLogin.com API specification. Added: - PKCE code_verifier and code_challenge generation (RFC 7636) - Database column: auth_state.code_verifier for PKCE support - Issuer validation for authentication callbacks - Comprehensive PKCE unit tests (6 tests, all passing) - Database migration script for code_verifier column Changed: - Corrected IndieLogin.com API endpoints (/authorize and /token) - State token validation now returns code_verifier for token exchange - Authentication flow follows IndieLogin.com API specification exactly - Enhanced logging with code_verifier redaction Removed: - OAuth metadata endpoint (/.well-known/oauth-authorization-server) Added in v0.7.0 but not required by IndieLogin.com - h-app microformats markup from templates Modified in v0.7.1 but not used by IndieLogin.com - indieauth-metadata link from HTML head Security: - PKCE prevents authorization code interception attacks - Issuer validation prevents token substitution attacks - Code verifier securely stored, redacted in logs, and single-use Documentation: - Version: 0.8.0 - CHANGELOG updated with v0.8.0 entry and v0.7.x notes - ADR-016 and ADR-017 marked as superseded by ADR-019 - Implementation report created in docs/reports/ - Test update guide created in TODO_TEST_UPDATES.md Breaking Changes: - Users mid-authentication will need to restart login after upgrade - Database migration required before deployment Related: ADR-019 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
14 KiB
ADR-019 Implementation: Versioning Guidance
Date: 2025-11-19 Author: StarPunk Architect Status: Final Recommendation
Current Situation
Current Version: 0.7.1 Released Tags: v0.4.0, v0.5.2, v0.6.0, v0.6.1, v0.7.0, v0.7.1
Problem: ADR-019 initially suggested v0.6.3, but we have already released v0.7.0 and v0.7.1. We cannot go backward in semantic versioning (0.7.1 → 0.6.3 is invalid).
What v0.7.0 and v0.7.1 Contained
v0.7.0 (2025-11-19)
Added:
- IndieAuth detailed logging with token redaction
- OAuth Client ID Metadata Document endpoint (
/.well-known/oauth-authorization-server)- NOTE: This endpoint is unnecessary and will be removed in ADR-019 implementation
Changed:
- Enhanced authentication flow visibility with structured logging
- LOG_LEVEL environment variable for configurable logging
Security:
- Automatic token redaction in logs
v0.7.1 (2025-11-19)
Fixed:
- IndieAuth h-app visibility (removed
hiddenandaria-hiddenattributes)- Made h-app microformat visible to parsers for backward compatibility
- NOTE: h-app microformats are unnecessary and will be removed in ADR-019 implementation
Analysis of Changes in ADR-019 Implementation
What ADR-019 Will Do
Fixes:
- Fix broken IndieAuth authentication (critical bug)
- Add PKCE implementation (security enhancement, required by IndieLogin.com)
- Correct API endpoints (/authorize and /token instead of /auth)
- Add issuer validation
Removes:
- OAuth metadata endpoint added in v0.7.0 (unnecessary)
- h-app microformats modified in v0.7.1 (unnecessary)
Changes:
- Database schema: adds
code_verifiercolumn toauth_statetable - Authentication flow: implements PKCE properly
Semantic Versioning Analysis
According to /home/phil/Projects/starpunk/docs/standards/versioning-strategy.md:
MAJOR (x.0.0):
- Breaking API changes
- Database schema changes requiring migration ✓ (we have this)
- Configuration file format changes
- Removal of deprecated features
MINOR (0.x.0):
- New features (backward compatible)
- New API endpoints
- Non-breaking enhancements
- Optional configuration parameters
PATCH (0.0.x):
- Bug fixes
- Security patches
- Documentation corrections
- Dependency updates
Special Rules for 0.x.y versions (from versioning-strategy.md):
"Public API should not be considered stable. Breaking changes allowed without major version increment."
During the 0.x phase, we have flexibility.
Change Classification
This implementation includes:
- Critical bug fix - Authentication completely broken
- Security enhancement - PKCE implementation (best practice)
- Database schema change - Adding column (backward compatible with DEFAULT)
- Feature removal - OAuth metadata endpoint (added in v0.7.0, never worked)
- Code cleanup - Removing unnecessary h-app microformats
NOT included:
- New user-facing features
- Breaking API changes for working features
- Configuration changes requiring user intervention
Version Number Decision
Recommended: v0.8.0 (MINOR Increment)
Rationale:
-
Following 0.x Convention: During the 0.x phase (pre-1.0), MINOR increments are used for both features and breaking changes. This is documented in our versioning strategy.
-
This is a Significant Change:
- Fixes critical broken functionality
- Adds PKCE (security enhancement)
- Changes authentication flow
- Modifies database schema
- Removes features added in v0.7.0
-
Database Schema Change: While backward compatible (DEFAULT clause), schema changes traditionally warrant MINOR increment.
-
Not a PATCH: Too substantial for PATCH (0.7.2):
- Not a simple bug fix
- Adds new security mechanism (PKCE)
- Removes endpoints
- Changes multiple files and flow
-
Not MAJOR (1.0.0): We're not ready for 1.0:
- Still in development phase
- V1 feature set not complete
- This fixes existing planned functionality, doesn't complete the roadmap
Version Progression Comparison
Option A: v0.8.0 (RECOMMENDED)
v0.7.0 → Logging + OAuth metadata (broken)
v0.7.1 → h-app visibility fix (unnecessary)
v0.8.0 → Fix IndieAuth with PKCE, remove unnecessary features
v1.0.0 → (Future) First stable release when all V1 features complete
Option B: v0.7.2 (NOT RECOMMENDED)
v0.7.0 → Logging + OAuth metadata (broken)
v0.7.1 → h-app visibility fix (unnecessary)
v0.7.2 → Fix IndieAuth with PKCE, remove unnecessary features
v1.0.0 → (Future) First stable release
Too minor for the scope of changes. PATCH should be simple fixes.
Option C: v1.0.0 (NOT RECOMMENDED - TOO EARLY)
v0.7.0 → Logging + OAuth metadata (broken)
v0.7.1 → h-app visibility fix (unnecessary)
v1.0.0 → Fix IndieAuth with PKCE, remove unnecessary features
Premature. Not all V1 features complete. 1.0.0 should signal "production ready."
Git Tag Handling
Recommendation: Keep All Existing Tags
Do NOT delete v0.7.0 or v0.7.1
Rationale:
- Git History Integrity: Tags mark historical points. Deleting creates confusion.
- Semantic Versioning Rules: You can't "un-release" a version.
- Traceability: Keep record of what was attempted even if it didn't work.
- Documentation: CHANGELOG will explain the situation clearly.
What To Do Instead
Mark v0.7.0 and v0.7.1 as broken in documentation:
- CHANGELOG notes explain what didn't work
- GitHub release notes (if using) can be updated with warnings
- README or docs can reference the issue
CHANGELOG Updates
How to Document This
Add v0.8.0 entry:
## [0.8.0] - 2025-11-19
### Fixed
- **CRITICAL**: Fixed IndieAuth authentication to work with IndieLogin.com
- Implemented required PKCE (Proof Key for Code Exchange) for security
- Corrected IndieLogin.com API endpoints (/authorize and /token)
- Added issuer validation for authentication callbacks
### Added
- PKCE code_verifier generation and storage
- PKCE code_challenge generation and validation
- Database column: auth_state.code_verifier for PKCE support
### Removed
- OAuth Client ID Metadata Document endpoint (/.well-known/oauth-authorization-server)
- Added in v0.7.0 but unnecessary for IndieLogin.com
- IndieLogin.com does not use OAuth client discovery
- h-app microformats markup from templates
- Modified in v0.7.1 but unnecessary for IndieLogin.com
- IndieLogin.com does not parse h-app for client identification
- indieauth-metadata link from HTML head
### Changed
- Authentication flow now follows IndieLogin.com API specification exactly
- Database schema: auth_state table includes code_verifier column
- State token validation now returns code_verifier for token exchange
### Security
- PKCE prevents authorization code interception attacks
- Issuer validation prevents token substitution attacks
- Code verifier securely stored and single-use
### Breaking Changes
- Users mid-authentication when upgrading will need to restart login (state tokens expire in 5 minutes)
- Existing state tokens without code_verifier will be invalid (intentional security improvement)
### Notes on Previous Versions
- **v0.7.0**: OAuth metadata endpoint added based on misunderstanding of requirements. This endpoint was never functional for our use case and is removed in v0.8.0.
- **v0.7.1**: h-app visibility changes attempted to fix authentication but addressed wrong issue. h-app discovery not used by IndieLogin.com. Removed in v0.8.0.
- **v0.8.0**: Correct implementation based on official IndieLogin.com API documentation.
### Related Documentation
- ADR-019: IndieAuth Correct Implementation Based on IndieLogin.com API
- Design Document: docs/designs/indieauth-pkce-authentication.md
- ADR-016: Superseded (h-app client discovery not required)
- ADR-017: Superseded (OAuth metadata not required)
### Migration Notes
- Database migration required: Add code_verifier column to auth_state table
- See docs/designs/indieauth-pkce-authentication.md for full implementation guide
Update v0.7.0 entry with note:
## [0.7.0] - 2025-11-19
### Added
- **IndieAuth Detailed Logging**: Comprehensive logging for authentication flows
- Logging helper functions with automatic token redaction
- **OAuth Client ID Metadata Document endpoint** (/.well-known/oauth-authorization-server)
- **NOTE (2025-11-19)**: This endpoint was added based on misunderstanding of IndieLogin.com requirements. IndieLogin.com does not use OAuth client discovery. This endpoint is removed in v0.8.0. See ADR-019 for correct implementation.
[... rest of v0.7.0 entry ...]
### Known Issues
- **IndieAuth authentication still broken**: This release attempted to fix authentication by adding OAuth metadata endpoint, but this is not required by IndieLogin.com. Missing PKCE implementation is the actual issue. Fixed in v0.8.0.
Update v0.7.1 entry with note:
## [0.7.1] - 2025-11-19
### Fixed
- **IndieAuth h-app Visibility**: Removed `hidden` and `aria-hidden="true"` attributes from h-app microformat markup
- h-app was invisible to IndieAuth parsers
- **NOTE (2025-11-19)**: This fix attempted to enable client discovery, but IndieLogin.com does not use h-app microformats. h-app markup removed entirely in v0.8.0. See ADR-019 for correct implementation.
### Known Issues
- **IndieAuth authentication still broken**: This release attempted to fix authentication by making h-app visible, but IndieLogin.com does not parse h-app. Missing PKCE implementation is the actual issue. Fixed in v0.8.0.
Version File Updates
File: /home/phil/Projects/starpunk/starpunk/__init__.py
Current (line 156):
__version__ = "0.7.1"
__version_info__ = (0, 7, 1)
Change to:
__version__ = "0.8.0"
__version_info__ = (0, 8, 0)
Git Tag Creation
After implementation and testing complete:
# Commit all changes
git add .
git commit -m "feat: Implement PKCE authentication for IndieLogin.com
- Add PKCE code_verifier and code_challenge generation
- Correct IndieLogin.com API endpoints (/authorize, /token)
- Add issuer validation
- Remove unnecessary OAuth metadata endpoint (from v0.7.0)
- Remove unnecessary h-app microformats (from v0.7.1)
- Update database schema: add auth_state.code_verifier column
Fixes critical IndieAuth authentication bug.
Version: 0.8.0
Related: ADR-019
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>"
# Create annotated tag
git tag -a v0.8.0 -m "Release 0.8.0: Fix IndieAuth Authentication with PKCE
Critical Fixes:
- Implemented PKCE (Proof Key for Code Exchange) as required by IndieLogin.com
- Corrected IndieLogin.com API endpoints
- Added issuer validation
- Fixed broken authentication flow
Removals:
- OAuth metadata endpoint (v0.7.0, unnecessary)
- h-app microformats (v0.7.1, unnecessary)
Security Enhancements:
- PKCE prevents authorization code interception
- Issuer validation prevents token substitution
Breaking Changes:
- Users mid-authentication must restart login after upgrade
- Database migration required (add auth_state.code_verifier column)
This release corrects authentication issues in v0.7.0 and v0.7.1 by implementing
the IndieLogin.com API specification correctly. See ADR-019 and design document
for full details.
See CHANGELOG.md for complete change details."
# Push
git push origin main
git push origin v0.8.0
Summary: What the Developer Should Do
1. Version Number
Use: 0.8.0
- Update
starpunk/__init__.py:__version__ = "0.8.0"and__version_info__ = (0, 8, 0)
2. Git Tags
Keep all existing tags: v0.4.0, v0.5.2, v0.6.0, v0.6.1, v0.7.0, v0.7.1 Create new tag: v0.8.0 after implementation complete
3. CHANGELOG Updates
- Add v0.8.0 entry with comprehensive details
- Update v0.7.0 entry with note about OAuth metadata being unnecessary
- Update v0.7.1 entry with note about h-app being unnecessary
- Explain the progression and corrections clearly
4. GitHub Release (if used)
- Create v0.8.0 release from tag
- Use tag message as release notes
- Optionally update v0.7.0 and v0.7.1 release descriptions with warnings
5. Documentation Updates
- ADR-016: Change status to "Superseded by ADR-019"
- ADR-017: Change status to "Superseded by ADR-019"
- ADR-005: Add implementation note referencing ADR-019
Rationale for v0.8.0
Why NOT v0.7.2 (PATCH):
- Too substantial (PKCE implementation, endpoint changes, removals)
- Database schema change
- Semantic versioning: PATCH should be simple fixes
- This is a significant rework, not a small fix
Why NOT v1.0.0 (MAJOR):
- Not all V1 features complete yet
- Still in development phase (0.x series)
- 1.0.0 should signal "production ready, all planned features"
- This fixes existing planned functionality, doesn't complete roadmap
Why v0.8.0 (MINOR):
- Appropriate for 0.x development phase
- Signals significant change from v0.7.x
- Follows project versioning strategy for 0.x phase
- Database schema change warrants MINOR
- Keeps clean numbering progression toward 1.0.0
Version Roadmap
Current Path:
v0.7.0 - Logging + OAuth metadata (misunderstood requirements)
v0.7.1 - h-app visibility (wrong fix)
v0.8.0 - PKCE + correct IndieLogin.com implementation (THIS RELEASE)
v0.9.0 - (Future) Additional features or fixes
v1.0.0 - (Future) First stable release with all V1 features
This progression clearly shows:
- v0.7.x attempted fixes based on wrong understanding
- v0.8.0 correct implementation based on actual API requirements
- Clean path to v1.0.0 when V1 scope is complete
Decision: Use v0.8.0 Reasoning: MINOR increment appropriate for significant fix with schema change during 0.x phase Action: Update version to 0.8.0, create tag v0.8.0, update CHANGELOG with detailed notes Git Tags: Keep all existing tags (v0.7.0, v0.7.1), add v0.8.0