This guide shows how to create custom MonoCloudBackendNodeClient instances and use them with protectApi() hook instances.
By default, each protectApi() call creates its own client. Use custom clients when:
This guide assumes you've completed the installation guide.
You should already have:
@monocloud/backend-node SDK installed.envCreate MonoCloudBackendNodeClient instances and pass them to protectApi(). Each client manages its own configuration, JWKS cache, and metadata cache.
import "dotenv/config";
import Fastify from "fastify";
import {
MonoCloudBackendNodeClient,
protectApi,
type AuthenticatedFastifyRequest,
} from "@monocloud/backend-node/fastify";
const app = Fastify();
// Create a public API client - reads from environment variables
const publicClient = new MonoCloudBackendNodeClient();
// Create an admin API client
const adminClient = new MonoCloudBackendNodeClient({
tenantDomain: process.env.ADMIN_API_TENANT_DOMAIN,
audience: process.env.ADMIN_API_AUDIENCE
});
const protectPublicApi = protectApi(publicClient);
const protectAdminApi = protectApi(adminClient);
// Public API
app.get("/api/data", { onRequest: protectPublicApi() }, async (request) => {
const { claims } = request as AuthenticatedFastifyRequest;
return { claims };
});
// Admin API
app.get(
"/api/admin", { onRequest: protectAdminApi() }, async (request) => {
const { claims } = request as AuthenticatedFastifyRequest;
return { claims };
}
);
app.listen({ port: 3000 });
How it works:
MonoCloudBackendNodeClient manages JWKS and metadata caching internallypublicClient uses configuration from environment variablesadminClient uses an explicit tenant domain and audienceprotectPublicApi and protectAdminApi use separate client instances with independent caches and configuration