Replace all ~1,086 occurrences of Wizamart/wizamart/WIZAMART/WizaMart with Orion/orion/ORION across 184 files. This includes database identifiers, email addresses, domain references, R2 bucket names, DNS prefixes, encryption salt, Celery app name, config defaults, Docker configs, CI configs, documentation, seed data, and templates. Renames homepage-wizamart.html template to homepage-orion.html. Fixes duplicate file_pattern key in api.yaml architecture rule. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Customer Authentication - Quick Summary
Date: 2025-11-24 Full Documentation: customer-authentication-implementation.md
What Was Implemented
✅ Customer login, registration, and forgot password pages ✅ Customer dashboard with account overview ✅ Complete customer authentication system separate from admin/store ✅ Multi-access routing support (domain, subdomain, path-based) ✅ Secure cookie management with proper path restrictions ✅ Theme integration and responsive design ✅ Custom logout confirmation modal (Tailwind CSS + Alpine.js)
Key Files
Created
app/templates/shop/account/login.htmlapp/templates/shop/account/register.htmlapp/templates/shop/account/forgot-password.htmlapp/templates/shop/account/dashboard.html
Modified
app/api/v1/shop/auth.py- Dynamic cookie pathsapp/api/deps.py- Customer authentication dependencyapp/services/customer_service.py- Direct JWT token creationapp/routes/shop_pages.py- Customer type hintsmiddleware/store_context.py- Harmonized detection methods
Critical Architecture Decision
Customers ≠ Users
- Users (admin/store): Have
role,username, managed byauth_service - Customers: Store-scoped, have
customer_number, managed bycustomer_service
JWT tokens have type: "customer" to distinguish them.
Cookie Path Logic
# Domain/Subdomain access
cookie_path = "/shop"
# Path-based access (/stores/orion/shop)
cookie_path = f"/stores/{store_code}/shop"
Authentication Flow
- Login → Create JWT with
type: "customer" - Set cookie with store-aware path
- Dashboard request → Cookie sent (path matches!)
- Dependency decodes JWT, validates type, loads Customer
- Render dashboard with customer data
Logout Flow
- User clicks "Logout" button → Custom Tailwind modal appears
- User confirms → API call to
/api/v1/shop/auth/logout - Cookie deleted, localStorage cleared
- Success toast shown, redirect to login page
Note: Uses custom modal instead of browser's confirm() for better UX and styling consistency.
Testing URLs
# Path-based access
http://localhost:8000/stores/orion/shop/account/login
http://localhost:8000/stores/orion/shop/account/register
http://localhost:8000/stores/orion/shop/account/dashboard
Next Steps (TODO)
- Implement password reset functionality
- Add email verification
- Build account management pages (orders, profile, addresses)
- Add refresh tokens for longer sessions
- Implement rate limiting on auth endpoints