Skip to main content

Installation & Configuration

Step 1: Install the package

npm install @nik2208/node-auth
TypeScript

node-auth is written in TypeScript and ships with its own type declarations — no @types/ package needed.


Step 2: Configure AuthConfigurator

Create an AuthConfig object and pass it to AuthConfigurator along with your IUserStore implementation:

import { AuthConfigurator, AuthConfig } from '@nik2208/node-auth';
import { MyUserStore } from './my-user-store';

const config: AuthConfig = {
accessTokenSecret: process.env.ACCESS_TOKEN_SECRET!,
refreshTokenSecret: process.env.REFRESH_TOKEN_SECRET!,
accessTokenExpiresIn: '15m',
refreshTokenExpiresIn: '7d',
};

const auth = new AuthConfigurator(config, new MyUserStore());

AuthConfig Options

OptionTypeRequiredDefaultDescription
accessTokenSecretstringSecret for signing access tokens
refreshTokenSecretstringSecret for signing refresh tokens
accessTokenExpiresInstringAccess token TTL (e.g. '15m')
refreshTokenExpiresInstringRefresh token TTL (e.g. '7d')
buildTokenPayload(user) => objectInject custom claims into JWT
csrf.enabledbooleanfalseEnable CSRF double-submit cookie
emailVerification'none'|'lazy'|'strict''none'Email verification mode
require2FAbooleanfalseRequire 2FA for all logins

Step 3: Mount the router

import express from 'express';
import rateLimit from 'express-rate-limit';

const app = express();
app.use(express.json());

const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 20 });

app.use('/auth', auth.router({
rateLimiter: limiter,
onRegister: async (data, config) => {
return userStore.create(data);
},
}));

app.listen(3000);

Complete Configuration Example

import express from 'express';
import rateLimit from 'express-rate-limit';
import { AuthConfigurator, AuthConfig } from '@nik2208/node-auth';
import { MyUserStore } from './stores/user-store';
import { MySessionStore } from './stores/session-store';
import { MyRbacStore } from './stores/rbac-store';

const app = express();
app.use(express.json());

const config: AuthConfig = {
accessTokenSecret: process.env.ACCESS_TOKEN_SECRET!,
refreshTokenSecret: process.env.REFRESH_TOKEN_SECRET!,
accessTokenExpiresIn: '15m',
refreshTokenExpiresIn: '7d',
emailVerification: 'lazy',
csrf: { enabled: true },
buildTokenPayload: async (user) => ({
tenantId: user.tenantId,
plan: user.plan,
}),
};

const userStore = new MyUserStore();
const sessionStore = new MySessionStore();
const rbacStore = new MyRbacStore();

const auth = new AuthConfigurator(config, userStore);

const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 20 });

app.use('/auth', auth.router({
rateLimiter: limiter,
sessionStore,
rbacStore,
onRegister: async (data, config) => {
return userStore.create(data);
},
}));

app.listen(3000);