Authentication
Authentication
All Manacore applications use Mana Core Auth as the central authentication service, providing EdDSA JWT-based authentication.
Overview
┌─────────────┐ ┌─────────────┐ ┌────────────────┐│ Client │────>│ Backend │────>│ mana-core-auth ││ (Web/Mobile)│ │ (NestJS) │ │ (port 3001) │└─────────────┘ └─────────────┘ └────────────────┘ │ │ │ │ Bearer token │ POST /validate │ │ │ {token} │ │ │<────────────────────│ │ │ {valid, payload} │ │<──────────────────│ │ │ Response │ │JWT Token Structure
Mana Core Auth uses EdDSA (Ed25519) for JWT signing:
{ "sub": "user-uuid", "email": "user@example.com", "role": "user", "sid": "session-uuid", "exp": 1764606251, "iss": "manacore", "aud": "manacore"}| Claim | Description |
|---|---|
sub | User ID (UUID) |
email | User’s email address |
role | User role (user, admin) |
sid | Session ID for invalidation |
exp | Expiration timestamp |
iss | Issuer (manacore) |
aud | Audience (manacore) |
Backend Integration
Option 1: Simple Auth Only
Use @manacore/shared-nestjs-auth for JWT validation:
import { JwtAuthModule } from '@manacore/shared-nestjs-auth';
@Module({ imports: [ JwtAuthModule.register({ authServiceUrl: process.env.MANA_CORE_AUTH_URL, }), ],})export class AppModule {}import { JwtAuthGuard, CurrentUser, CurrentUserData } from '@manacore/shared-nestjs-auth';
@Controller('api')@UseGuards(JwtAuthGuard)export class MyController { @Get('profile') getProfile(@CurrentUser() user: CurrentUserData) { return { userId: user.userId, email: user.email }; }}Option 2: Auth + Credits
Use @mana-core/nestjs-integration for full integration:
import { ManaCoreModule } from '@mana-core/nestjs-integration';
@Module({ imports: [ ManaCoreModule.forRootAsync({ imports: [ConfigModule], useFactory: (config: ConfigService) => ({ appId: config.get('APP_ID'), serviceKey: config.get('MANA_CORE_SERVICE_KEY'), debug: config.get('NODE_ENV') === 'development', }), inject: [ConfigService], }), ],})export class AppModule {}import { AuthGuard } from '@mana-core/nestjs-integration/guards';import { CurrentUser } from '@mana-core/nestjs-integration/decorators';import { CreditClientService } from '@mana-core/nestjs-integration';
@Controller('api')@UseGuards(AuthGuard)export class ApiController { constructor(private creditClient: CreditClientService) {}
@Post('generate') async generate(@CurrentUser() user: any) { // Consume credits for the operation await this.creditClient.consumeCredits( user.sub, 'generation', 10, 'AI generation' ); // ... perform operation }}Client Integration
Web (SvelteKit)
import { createAuthService } from '@manacore/shared-auth';
export const auth = createAuthService({ authUrl: import.meta.env.PUBLIC_MANA_CORE_AUTH_URL,});
// Usage in componentconst { data, error } = await auth.login(email, password);if (data) { // Store token, redirect to app}Mobile (Expo)
import { createAuthService } from '@manacore/shared-auth';
export const auth = createAuthService({ authUrl: process.env.EXPO_PUBLIC_MANA_CORE_AUTH_URL, storage: AsyncStorage, // Expo AsyncStorage});API Endpoints
Public Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/v1/auth/register | POST | Create new account |
/api/v1/auth/login | POST | Login with credentials |
/api/v1/auth/refresh | POST | Refresh access token |
/api/v1/auth/logout | POST | Invalidate session |
Protected Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/v1/auth/me | GET | Get current user |
/api/v1/auth/sessions | GET | List active sessions |
/api/v1/auth/sessions/:id | DELETE | Revoke session |
Environment Variables
Backend Services
# RequiredMANA_CORE_AUTH_URL=http://localhost:3001
# For development bypass (optional)NODE_ENV=developmentDEV_BYPASS_AUTH=trueDEV_USER_ID=test-user-uuid
# For credit operationsMANA_CORE_SERVICE_KEY=your-service-keyAPP_ID=your-app-idClient Apps
PUBLIC_MANA_CORE_AUTH_URL=http://localhost:3001EXPO_PUBLIC_MANA_CORE_AUTH_URL=http://localhost:3001Testing Authentication
-
Start Mana Core Auth
Terminal window pnpm dev:auth -
Get a token
Terminal window TOKEN=$(curl -s -X POST http://localhost:3001/api/v1/auth/login \-H "Content-Type: application/json" \-d '{"email": "test@example.com", "password": "password"}' \| jq -r '.accessToken') -
Call protected endpoint
Terminal window curl http://localhost:3002/api/v1/profile \-H "Authorization: Bearer $TOKEN"
Development Bypass
For faster development, you can bypass authentication:
// Only in development!if (process.env.DEV_BYPASS_AUTH === 'true') { // Use mock user return { userId: process.env.DEV_USER_ID, email: 'dev@example.com', role: 'admin', };}Security Best Practices
- Always use HTTPS in production
- Rotate JWT keys periodically
- Keep tokens short-lived (15m access, 7d refresh)
- Validate on every request - don’t trust client storage
- Implement rate limiting on auth endpoints
- Log authentication events for audit trails
Integrated Services
| Backend | Package | Port |
|---|---|---|
| Chat | @mana-core/nestjs-integration | 3002 |
| Picture | @manacore/shared-nestjs-auth | 3006 |
| Zitare | @manacore/shared-nestjs-auth | 3007 |
| ManaDeck | @mana-core/nestjs-integration | 3009 |
| Contacts | @manacore/shared-nestjs-auth | 3015 |