Overview
Wacht JWT tokens contain claims that identify the user, their session, and their permissions within organizations and workspaces. Understanding these claims is essential for implementing proper authorization in your application.Token Structure
Standard Claims
Claim Descriptions
Core Claims
Token issuer, typically your Wacht deployment URL (e.g., “https://app.wacht.io”)
Subject identifier - the user’s unique ID in the system
Issued at time as Unix timestamp. Used to determine token age.
Expiration time as Unix timestamp. Token is invalid after this time.
Unique identifier for the user’s session. Used for session management and revocation.
Organization Claims
Current organization ID if user has switched to an organization context
List of permissions the user has within the organization. Examples:
users:read- View usersusers:write- Manage usersbilling:manage- Manage billingsettings:admin- Admin settings
Workspace Claims
Current workspace ID if user is in a workspace context
List of permissions the user has within the workspace. Examples:
projects:read- View projectsprojects:write- Create/edit projectscontent:manage- Manage contentmembers:invite- Invite members
Example Token Payload
Personal Context
User in their personal workspace:Organization Context
User switched to an organization:Workspace Context
User in a specific workspace:Using Claims in Your Application
Accessing Claims
After authentication, claims are available in theAuthContext:
Permission Checking
Permission Patterns
Common Organization Permissions
| Permission | Description |
|---|---|
users:read | View organization users |
users:write | Add/remove users |
users:admin | Full user management |
billing:read | View billing info |
billing:manage | Update payment methods |
settings:read | View org settings |
settings:admin | Modify org settings |
audit:view | View audit logs |
admin:full | Full admin access |
Common Workspace Permissions
| Permission | Description |
|---|---|
projects:read | View projects |
projects:write | Create/edit projects |
projects:delete | Delete projects |
content:read | View content |
content:write | Create/edit content |
content:publish | Publish content |
members:view | View members |
members:invite | Invite new members |
workspace:admin | Full workspace control |
Custom Claims
Adding Custom Claims
Custom claims can be added during token generation:Accessing Custom Claims
Security Considerations
Token Size
- Keep claims minimal to reduce token size
- Large tokens can hit header size limits
- Consider storing detailed permissions server-side
Sensitive Data
- Never include passwords or secrets in claims
- Avoid PII unless necessary
- Claims are visible to anyone with the token
Permission Design
- Use hierarchical permissions when possible
- Implement least-privilege principle
- Regular permission audits
Token Lifecycle
Token Refresh
When tokens expire, clients need to refresh:Context Switching
When users switch organizations/workspaces:Best Practices
- Validate All Claims - Don’t trust claims blindly
- Check Permissions - Always verify user has required permissions
- Handle Missing Claims - Claims might be null/absent
- Time Validation - Check iat/exp for token freshness
- Audit Access - Log permission checks for security
Next Steps
- JWT Validation - How tokens are validated
- Permission Layer - Using permissions
- Extractors - Accessing claims in handlers
