@centinel/nextjs
Version:
Package designed to add Centinel Analytica functionality to Next.js applications
157 lines (114 loc) • 3.61 kB
Markdown
# Centinel Analytica Next.js Integration
Bot protection middleware for Next.js applications.
## Installation
```bash
npm install @centinel/nextjs
```
## Setup
### 1. Environment Variables
Add your Centinel keys to `.env`:
```
CENTINEL_SITE_KEY=your_site_key_here
CENTINEL_SECRET_KEY=your_secret_key_here
NEXT_PUBLIC_CENTINEL_SITE_KEY=your_site_key_here
```
**Note:** Use `CENTINEL_SITE_KEY` for server-side code (layouts, middleware). Use `NEXT_PUBLIC_CENTINEL_SITE_KEY` if using CentinelLayout in client-side pages.
### 2. Client Script
Add the CentinelLayout to your root layout:
```typescript
// app/layout.tsx (server-side)
import { CentinelLayout } from '@centinel/nextjs';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html>
<body>
<CentinelLayout siteKey={process.env.CENTINEL_SITE_KEY!}>
{children}
</CentinelLayout>
</body>
</html>
);
}
```
Or if using in a client-side page:
```typescript
// app/page.tsx (client-side)
'use client';
import { CentinelLayout } from '@centinel/nextjs';
export default function HomePage(): JSX.Element {
return (
<CentinelLayout siteKey={process.env.NEXT_PUBLIC_CENTINEL_SITE_KEY!}>
{/* Your page content */}
</CentinelLayout>
);
}
```
### 3. Protection
Choose between automatic middleware or manual validation:
#### Option A: Middleware (Recommended)
Create `middleware.ts` in your project root:
```typescript
import { createCentinelMiddlewareFromEnv } from '@centinel/nextjs';
export default createCentinelMiddlewareFromEnv();
export const config = {
matcher: ['/api/:path*', '/dashboard/:path*']
};
```
#### Option B: Manual Validation
Use in specific API routes when middleware isn't suitable:
```typescript
// app/api/login/route.ts
import { createRequestValidatorFromEnv } from '@centinel/nextjs';
import { NextRequest, NextResponse } from 'next/server';
const { isBot } = createRequestValidatorFromEnv();
export async function POST(request: NextRequest) {
if (await isBot(request)) {
return NextResponse.json({ error: 'Blocked' }, { status: 403 });
}
return handleLogin(request);
}
```
Or with custom configuration:
```typescript
// app/api/protected/route.ts
import { createRequestValidator } from '@centinel/nextjs';
import { NextRequest, NextResponse } from 'next/server';
const { isBot } = createRequestValidator({
siteKey: 'your_site_key',
secretKey: 'your_secret_key'
});
export async function POST(request: NextRequest) {
if (await isBot(request)) {
return NextResponse.json({ error: 'Access denied' }, { status: 403 });
}
// Your protected logic
}
```
## Advanced Configuration
### Custom Configuration
Pass config directly instead of using environment variables:
```typescript
import { createCentinelMiddleware } from '@centinel/nextjs';
export default createCentinelMiddleware({
siteKey: 'your_site_key',
secretKey: 'your_secret_key'
});
```
### Route Matching
Specify which routes to protect:
```typescript
export const config = {
matcher: [
'/api/:path*', // All API routes
'/dashboard/:path*', // Dashboard pages
'/admin/:path*' // Admin area
]
};
```
## How It Works
Centinel validates each request before it reaches your application. Suspicious requests are blocked or redirected to a verification page. The client script helps distinguish legitimate users from bots.
**Note:** Blocked requests are redirected to `/block` by default. Create this page in your app or customize the redirect URL in your middleware configuration.