IndieWeb Concepts
=================
This document explains the IndieWeb concepts and protocols implemented by django-indieweb.
What is IndieWeb?
-----------------
The IndieWeb is a people-focused alternative to the "corporate web". It's a community of
independent website owners who want to own their data and stay connected. Key principles include:
- **Own your data** - Your content lives on your domain
- **Syndicate elsewhere** - Cross-post to social networks
- **Interoperability** - Standards-based protocols for communication
IndieAuth Protocol
------------------
IndieAuth is a federated login protocol that uses your own domain name as your identity.
It's built on top of OAuth 2.0 but simplified for the IndieWeb use case.
How IndieAuth Works
~~~~~~~~~~~~~~~~~~~
.. mermaid::
graph TD
A[User owns domain.com] --> B[User wants to sign in to app.com]
B --> C[App redirects to user's auth endpoint]
C --> D[User authenticates on their own site]
D --> E[Auth endpoint redirects back with code]
E --> F[App exchanges code for verification]
F --> G[User is logged in as domain.com]
Key Components
~~~~~~~~~~~~~~
1. **Identity (me)** - Your domain name (e.g., ``https://example.com``)
2. **Client ID** - The application requesting authentication
3. **Authorization Endpoint** - Where users approve access
4. **Token Endpoint** - Where codes are exchanged for tokens
5. **Redirect URI** - Where to return after authorization
IndieAuth vs OAuth
~~~~~~~~~~~~~~~~~~
While similar to OAuth, IndieAuth has key differences:
- Your identity is your domain, not an account on a service
- No client registration required
- Simpler flow focused on authentication and authorization
- Designed for individual website owners
Micropub Protocol
-----------------
Micropub is a protocol for creating posts on your website using third-party clients.
Core Concepts
~~~~~~~~~~~~~
.. mermaid::
graph LR
A[Micropub Client] --> B[Sends POST request]
B --> C[With access token]
C --> D[To Micropub endpoint]
D --> E[Creates content]
E --> F[Returns 201 Created]
Post Types
~~~~~~~~~~
Micropub supports various post types through the ``h`` parameter:
- ``h-entry`` - Standard blog posts, notes, articles
- ``h-event`` - Events with start/end times
- ``h-card`` - Profile/contact information
Common Properties
~~~~~~~~~~~~~~~~~
- ``content`` - The main post content
- ``name`` - Post title
- ``category`` - Tags/categories
- ``in-reply-to`` - URL being replied to
- ``location`` - Geographic coordinates
- ``photo`` - Image URLs
Implementation Architecture
---------------------------
django-indieweb implements these protocols with three main components:
.. mermaid::
classDiagram
class Auth {
+key: str
+owner: User
+client_id: str
+redirect_uri: str
+scope: str
+me: str
+created: datetime
}
class Token {
+key: str
+owner: User
+client_id: str
+me: str
+scope: str
+created: datetime
}
class AuthView {
+get() : authorization code
+post() : verify code
}
class TokenView {
+post() : access token
}
class MicropubView {
+get() : configuration
+post() : create content
}
Auth --> AuthView : creates
AuthView --> TokenView : provides code
TokenView --> Token : creates
Token --> MicropubView : authenticates
Data Flow
~~~~~~~~~
1. **Authorization Phase**
- User visits AuthView with client details
- Django authenticates user (standard login)
- Auth object created with temporary code
- User redirected back to client with code
2. **Token Exchange**
- Client POSTs code to TokenView
- Code validated (exists, not expired, matches parameters)
- Token object created with access key
- Access token returned to client
3. **Content Creation**
- Client sends POST to MicropubView with token
- Token validated (exists, active user, scope matches the requested
operation)
- The configured ``MicropubContentHandler`` creates the entry (the
in-memory handler ships by default; see :doc:`micropub` for custom
handlers)
- ``201 Created`` returned with a ``Location`` header pointing at the
new entry
Security Model
--------------
Authorization Codes
~~~~~~~~~~~~~~~~~~~
- Single use - deleted after exchange
- Time limited - 60 seconds by default
- Bound to specific client_id and redirect_uri
- Random 32-character strings
Access Tokens
~~~~~~~~~~~~~
- Expire after ``INDIEWEB_TOKEN_EXPIRES_IN`` seconds (default 86400, i.e. 24 hours); reissuing the token via the IndieAuth flow refreshes the expiration
- Tokens issued before expiration tracking was added have ``expires_at=NULL`` and remain valid until they are reissued or deleted
- Bound to user, client, and scope
- Can be revoked by deleting the Token object
- Should be transmitted over HTTPS only
Scopes
~~~~~~
Scopes limit what actions a token can perform. During authorization,
django-indieweb normalizes the requested scope string by splitting on
whitespace, removing duplicate tokens while preserving first-seen order, and
joining the result with single spaces. Unknown scope names are accepted and
preserved because IndieAuth/Micropub scopes are extension-defined.
The token endpoint issues the normalized scope stored with the auth code. If a
token exchange includes a ``scope`` parameter, the submitted value is
normalized and must exactly match the stored auth-code scope; clients cannot
broaden, narrow, or replace the approved scope at token issuance time. An
explicitly empty ``scope=`` parameter normalizes to no scope and is accepted
only for an auth code issued with no scope.
The Micropub resource server enforces scopes per operation; see :doc:`api` and
:doc:`indieauth` for the full mapping.
- ``create`` - Required for ``POST`` requests that create new posts (legacy
alias ``post`` is also accepted)
- ``update`` - Required for ``POST action=update`` and ``GET ?q=source``.
- ``delete`` - Required for ``POST action=delete``
- ``undelete`` - Required for ``POST action=undelete``
Best Practices
--------------
For Service Providers
~~~~~~~~~~~~~~~~~~~~~
1. Always use HTTPS in production
2. Validate all parameters strictly
3. Implement rate limiting
4. Log authorization attempts
5. Consider token expiration
For Users
~~~~~~~~~
1. Only authorize apps you trust
2. Use unique passwords for your domain
3. Review authorized apps regularly
4. Revoke unused tokens
Limitations
-----------
Current implementation limitations:
1. **No token revocation UI** - Must delete via Django admin
2. **No media endpoint** - Can't upload images
Future Enhancements
-------------------
Potential improvements for full IndieWeb support:
1. **Media Endpoint** - Handle file uploads
2. **Token Management** - UI for viewing/revoking tokens
3. **WebSub** - Real-time updates
Resources
---------
- `IndieWeb.org `_ - Main IndieWeb community site
- `IndieAuth Spec `_ - Protocol specification
- `Micropub Spec `_ - Micropub specification
- `IndieAuth.com `_ - Reference implementation