Zalt/docs
Back to docs

Node.js / Express Integration

Add Zalt authentication to your Node.js backend.

Installation

bash
npm install @zalt/core

Initialize Client

typescript
import { ZaltClient } from '@zalt/core';

const zalt = new ZaltClient({
  realmId: process.env.ZALT_REALM_ID,
  apiUrl: 'https://api.zalt.io',
});

Express Middleware

typescript
import express from 'express';
import { ZaltClient } from '@zalt/core';

const app = express();
const zalt = new ZaltClient({ realmId: process.env.ZALT_REALM_ID });

// Auth middleware
const requireAuth = async (req, res, next) => {
  const token = req.headers.authorization?.replace('Bearer ', '');
  
  if (!token) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  try {
    const user = await zalt.verifyToken(token);
    req.user = user;
    next();
  } catch (error) {
    return res.status(401).json({ error: 'Invalid token' });
  }
};

// Protected route
app.get('/api/profile', requireAuth, (req, res) => {
  res.json({ user: req.user });
});

app.listen(3000);

Login Endpoint

typescript
app.post('/api/login', async (req, res) => {
  const { email, password } = req.body;

  try {
    const result = await zalt.login({ email, password });
    
    if (result.mfaRequired) {
      return res.json({
        mfaRequired: true,
        sessionId: result.sessionId,
        methods: result.mfaMethods,
      });
    }

    res.json({
      user: result.user,
      accessToken: result.tokens.accessToken,
      refreshToken: result.tokens.refreshToken,
    });
  } catch (error) {
    res.status(401).json({ error: 'Invalid credentials' });
  }
});