A drop-in authentication microservice. Handles registration, login, MFA, SSO, and session management so your apps don't have to.
View on GitHubUsers sign up or log in with email/password or Google SSO. If MFA is enabled, a 6-digit code is sent to their email for verification.
Users authenticate with email/password or continue with Google via OAuth 2.0 with PKCE. Passwords are validated against bcrypt hashes with 14 salt rounds.
New users register with name, email, and a strong password. Server-side Zod schemas validate all fields. Duplicate emails are rejected with clear feedback.
When MFA is enabled, a 6-digit OTP is sent via email. Codes are bcrypt-hashed in storage. After 10 failed attempts, a 15-minute cooldown kicks in.
Split into a React client and Express server, deployed via Kubernetes with NGINX ingress and TLS.
REST API handling auth flows, token management, and sessions.
Login, registration, and MFA UI with real-time validation.
Containerized deployment with K8s orchestration.
Stateful sessions with JWT access tokens and PKCE OAuth.
Full OpenAPI 3.0 spec with Swagger UI available in development. All endpoints are under /api/accounts.
| Method | Endpoint | Description |
|---|---|---|
| POST | /auth/signin | Email/password login |
| POST | /auth/signup | Registration |
| DELETE | /auth/signout | Logout (clears session) |
| GET | /auth/signin/sso/{provider} | OAuth redirect (Google, Microsoft) |
| GET | /auth/signin/sso/{provider}/callback | OAuth callback |
| POST | /auth/mfa/challenge | Get MFA challenge details |
| POST | /auth/mfa/challenge/send | Send or resend MFA code |
| POST | /auth/mfa/challenge/verify | Verify MFA code |
| GET | /users/me | Current user info |
| GET | /users/me/linked-accounts | List linked SSO accounts |
| DELETE | /users/me/linked-accounts/{provider} | Unlink SSO account |
| GET | /users/me/sessions | List active sessions |
| DELETE | /users/me/sessions/{id} | Revoke a session |
Every layer is built with security in mind — from password storage to token signing to rate limiting.