npm install authsafe-express cookie-parseryarn add authsafe-express cookie-parserpnpm add authsafe-express cookie-parser# .env
AUTHSAFE_CLIENT_ID=your_client_id
AUTHSAFE_CLIENT_SECRET=your_client_secret
AUTHSAFE_DOMAIN=https://auth.yourapp.com
APP_URL=http://localhost:3000import express from 'express';
import cookieParser from 'cookie-parser';
import { initAuthSafe, requireAuth } from 'authsafe-express';
const app = express();
app.use(cookieParser());
// Initialize AuthSafe
initAuthSafe({
clientId: process.env.AUTHSAFE_CLIENT_ID!,
clientSecret: process.env.AUTHSAFE_CLIENT_SECRET!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
});import { handleSignIn, handleCallback, handleLogout } from 'authsafe-express';
// Sign in route
app.get('/auth/signin', (req, res) => {
handleSignIn(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
});
});
// OAuth callback
app.get('/auth/callback', (req, res) => {
handleCallback(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
clientSecret: process.env.AUTHSAFE_CLIENT_SECRET!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
});
});
// Logout route
app.post('/auth/logout', (req, res) => {
handleLogout(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
domain: process.env.AUTHSAFE_DOMAIN!,
});
});import { requireAuth } from 'authsafe-express';
// Protected route
app.get('/dashboard', requireAuth(), (req, res) => {
res.json({
message: `Welcome ${req.auth.email}`,
user: req.auth,
});
});app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});| Function | Description |
|---|---|
initAuthSafe() | Initialize global configuration |
requireAuth() | Require authentication for route |
optionalAuth() | Attach auth session if available |
requireScope() | Require specific scopes |
requireAnyScope() | Require any of specified scopes |
| Function | Route | Description |
|---|---|---|
handleSignIn() | GET /auth/signin | Initiate OAuth flow |
handleCallback() | GET /auth/callback | Process OAuth callback |
handleLogout() | POST /auth/logout | Sign out and clear session |
handleRefresh() | POST /auth/refresh | Refresh access tokens |
| Function | Description |
|---|---|
setAuthCookies() | Store tokens in secure cookies |
getAuthCookies() | Retrieve tokens from cookies |
clearAuthCookies() | Clear all auth cookies |
refreshTokens() | Refresh using refresh token |
| Function | Description |
|---|---|
verifyToken() | Verify JWT signature with JWKS |
decodeToken() | Decode JWT without verification |
extractUserId() | Extract user ID from subject |
isClientToken() | Check if token is M2M client |
isTokenExpired() | Check token expiration |
shouldRefreshToken() | Check if refresh needed |
import express from 'express';
import cookieParser from 'cookie-parser';
import {
initAuthSafe,
requireAuth,
optionalAuth,
requireScope,
handleSignIn,
handleCallback,
handleLogout,
handleRefresh,
} from 'authsafe-express';
const app = express();
app.use(express.json());
app.use(cookieParser());
// Initialize AuthSafe
initAuthSafe({
clientId: process.env.AUTHSAFE_CLIENT_ID!,
clientSecret: process.env.AUTHSAFE_CLIENT_SECRET!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
scopes: ['openid', 'email', 'profile', 'offline_access'],
});
// Auth routes
app.get('/auth/signin', (req, res) => {
handleSignIn(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
});
});
app.get('/auth/callback', (req, res) => {
handleCallback(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
clientSecret: process.env.AUTHSAFE_CLIENT_SECRET!,
domain: process.env.AUTHSAFE_DOMAIN!,
redirectUri: `${process.env.APP_URL}/auth/callback`,
});
});
app.post('/auth/logout', (req, res) => {
handleLogout(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
domain: process.env.AUTHSAFE_DOMAIN!,
});
});
app.post('/auth/refresh', (req, res) => {
handleRefresh(req, res, {
clientId: process.env.AUTHSAFE_CLIENT_ID!,
clientSecret: process.env.AUTHSAFE_CLIENT_SECRET!,
domain: process.env.AUTHSAFE_DOMAIN!,
});
});
// Public route
app.get('/', optionalAuth(), (req, res) => {
if (req.auth) {
res.json({ message: `Hello ${req.auth.email}` });
} else {
res.json({ message: 'Hello guest' });
}
});
// Protected route
app.get('/dashboard', requireAuth(), (req, res) => {
res.json({
message: 'Dashboard',
user: req.auth,
});
});
// Protected with scope
app.delete(
'/admin/users/:id',
requireAuth(),
requireScope('admin:delete'),
(req, res) => {
res.json({ message: 'User deleted' });
},
);
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});import type {
AuthSafeConfig,
AuthSession,
AuthTokens,
AuthenticatedRequest,
AuthSafeJWTPayload,
} from 'authsafe-express';
// Extend Express Request
app.get('/profile', requireAuth(), (req: AuthenticatedRequest, res) => {
const { userId, email, scopes } = req.auth;
res.json({ userId, email, scopes });
});requireScope() middleware