A full-stack application demonstrating enterprise-grade Zoom integration with OKTA/Auth0 authentication, featuring Server-to-Server OAuth, Meeting SDK integration, group-based authorization, and webhook handling.
This project implements a secure, scalable Zoom integration platform with enterprise Single Sign-On (SSO) capabilities through OKTA/Auth0. It consists of two main components:
- Server: Express.js backend with TypeScript for Zoom API integration and OKTA/Auth0 JWT validation
- Web: React frontend with Vite for embedded Zoom meetings and OKTA/Auth0 authentication
- π Enterprise SSO via OKTA/Auth0 with MFA support
- π₯ Group-Based Authorization - OKTA groups determine Zoom permissions
- π₯ Embedded Zoom Meetings using Meeting SDK
- π Server-to-Server OAuth for secure Zoom API access
- πͺ Webhook Integration for real-time Zoom events
- π Meeting Management (Create, Read, Update, Delete)
- π JWT-protected endpoints with OKTA claims validation
- π’ Organization-Based Access Control - Department and org-level restrictions
- π Comprehensive Audit Logging with OKTA context
- Node.js + Express
- TypeScript
- Auth0/OKTA (JWT authentication with enterprise SSO)
- Zoom Server-to-Server OAuth
- Zoom Meeting SDK
- express-oauth2-jwt-bearer (JWT validation)
- React 19
- TypeScript
- Vite
- Auth0 React SDK (with OKTA integration)
- Zoom Meeting SDK/Web SDK
- React Router
- Node.js (v18+ recommended)
- npm or yarn
- Zoom Developer Account
- Auth0 Account (can be configured with OKTA as identity provider)
- OKTA Account (optional, for enterprise SSO)
-
Clone the repository
git clone <repository-url> cd zoom_advanced_integration
-
Set up environment variables
Create
.env
files in both/server
and/web
directories based on the.env.example
templates:Server (
/server/.env
):# Auth0/OKTA Configuration AUTH0_DOMAIN=your-domain.auth0.com AUTH0_AUDIENCE=your-api-identifier AUTH0_ISSUER_BASE_URL=https://your-domain.auth0.com # OKTA Enterprise Connection (if using OKTA directly) OKTA_DOMAIN=your-company.okta.com OKTA_CLIENT_ID=okta-client-id OKTA_CLIENT_SECRET=okta-client-secret # Zoom S2S OAuth (internal app) ZOOM_ACCOUNT_ID=your_account_id ZOOM_CLIENT_ID=your_client_id ZOOM_CLIENT_SECRET=your_client_secret # Zoom Meeting SDK (Web) ZOOM_SDK_KEY=your_sdk_key ZOOM_SDK_SECRET=your_sdk_secret # Zoom Webhooks ZOOM_WEBHOOK_SECRET_TOKEN=your_webhook_secret_token
Web (
/web/.env
):VITE_AUTH0_DOMAIN=your-domain.auth0.com VITE_AUTH0_CLIENT_ID=your-client-id VITE_AUTH0_AUDIENCE=your-audience VITE_API_BASE=http://localhost:4000 # Optional: OKTA-specific settings if using OKTA directly VITE_OKTA_DOMAIN=your-company.okta.com VITE_OKTA_CLIENT_ID=okta-spa-client-id
-
Install dependencies
# Install server dependencies cd server npm install # Install web dependencies cd ../web npm install
-
Run the applications
In separate terminals:
# Terminal 1: Start the server (port 4000) cd server npm run dev # Terminal 2: Start the web app (port 5173) cd web npm run dev
-
Access the application
Open your browser and navigate to
http://localhost:5173
zoom_advanced_integration/
βββ server/ # Backend Express application
β βββ src/
β β βββ auth/ # Authentication middleware
β β βββ zoom/ # Zoom integration modules
β β βββ index.ts # Main server file
β βββ package.json
βββ web/ # Frontend React application
β βββ src/
β β βββ pages/ # React pages/routes
β β βββ zoom/ # Zoom SDK integration
β β βββ auth0.tsx # Auth0 configuration
β β βββ App.tsx # Main app component
β βββ package.json
βββ CLAUDE.md # Claude Code assistance guide
GET /health
- Health checkGET /api/docs
- API documentation
POST /api/sdk-signature
- Generate Meeting SDK signature (validates OKTA groups for role)
GET /api/meetings
- List meetings (filtered by organization)POST /api/meetings
- Create a meetingPUT /api/meetings/:meetingId
- Update a meeting (requires ownership/admin)DELETE /api/meetings/:meetingId
- Delete a meeting (requires ownership/admin)
POST /api/meetings/:meetingId/end
- End an active meetingPOST /api/meetings/:meetingId/recordings
- Manage recordings
POST /zoom/webhook
- Receive Zoom webhook events (signature validated)
cd server
npm run dev # Run with hot reload (tsx)
npm run build # Build TypeScript
npm start # Run production build
cd web
npm run dev # Start development server
npm run build # Build for production
npm run preview # Preview production build
-
Create OKTA Application:
- Type: Single Page Application (SPA)
- Grant Type: Authorization Code with PKCE
- Redirect URIs:
http://localhost:5173/callback
,https://your-app.com/callback
-
Configure OKTA Groups:
zoom-hosts
- Users who can host meetingszoom-admins
- Full administrative accessemployees
- Standard meeting participantscontractors
- Limited meeting access
-
Set up OKTA API Token (for group queries):
- Navigate to Security β API β Tokens
- Create token with appropriate scopes
-
Create Applications:
- Single Page Application (SPA) for frontend
- Machine-to-Machine API for backend
-
Configure Enterprise Connection (optional):
- Add OKTA as SAML or OIDC connection
- Map OKTA attributes to Auth0 claims
- Configure group mappings
-
Set Permissions:
- Configure allowed callback URLs
- Set CORS origins
- Enable refresh token rotation
-
Server-to-Server OAuth App:
- Scopes:
meeting:read
,meeting:write
(minimum required) - Note Account ID, Client ID, and Client Secret
- Scopes:
-
Meeting SDK App:
- Note SDK Key and SDK Secret
- Configure for production domain
-
Webhook Configuration:
- Endpoint URL:
https://your-domain.com/zoom/webhook
- Events: meeting.started, meeting.ended, participant.joined, participant.left
- Note Secret Token for validation
- Endpoint URL:
- Credential Protection: SDK secrets and OAuth credentials never leave the server
- Authentication: All API endpoints (except webhooks) require Auth0/OKTA JWT validation
- Authorization: OKTA groups determine user permissions and Zoom roles
- Time-boxed Signatures: Meeting SDK signatures expire after 2 hours
- Webhook Security: HMAC signature validation for all webhook requests
- Organization Isolation: Users can only access meetings within their organization
- Audit Logging: All actions logged with OKTA user context
- CORS: Restricted to specific origins in production
-
OKTA Authentication Failures:
- Verify OKTA domain and client ID in Auth0 enterprise connection
- Check user is assigned to the OKTA application
- Ensure user's groups are properly mapped in token claims
-
Permission Denied Errors:
- Verify user's OKTA groups in the JWT token
- Check group-to-permission mappings in server configuration
- Ensure Auth0 is passing group claims from OKTA
-
CORS Errors:
- Ensure server CORS configuration matches your frontend URL
- Add production domain to CORS whitelist
-
Auth0 Token Issues:
- Verify domain, client ID, and audience match in both frontend and backend
- Check token expiration and refresh token configuration
- Ensure scopes are properly requested
-
Zoom SDK Errors:
- Check SDK key/secret are correct and not exposed to client
- Verify signature is generated server-side with proper role validation
- Ensure meeting number and password are correct
-
Meeting Access Issues:
- Verify user's organization matches meeting's organization
- Check department-level restrictions if configured
- Ensure user has appropriate OKTA group for requested action
For issues or questions, please open an issue in the repository.