nestjs-cloudflare-turnstile
Version:
NestJS module for Cloudflare Turnstile CAPTCHA verification.
134 lines (100 loc) • 3.13 kB
Markdown
# NestJS Turnstile Captcha
A NestJS module for validating Cloudflare Turnstile CAPTCHA tokens.
## Description
This module makes it easy to integrate Cloudflare Turnstile CAPTCHA verification into your NestJS applications.
Supports both synchronous and asynchronous module configuration. Includes a Guard for convenient use in controllers.
## Installation
```bash
npm install nestjs-cloudflare-turnstile --save
# or
yarn add nestjs-cloudflare-turnstile
```
## Usage
### Import the module (synchronous)
```typescript
import { Module } from '@nestjs/common';
import { TurnstileModule } from 'nestjs-cloudflare-turnstile';
@Module({
imports: [
TurnstileModule.forRoot({
secretKey: process.env.TURNSTILE_SECRET_KEY,
token: req => req.body.captchaToken,
skipIf: false
}),
],
})
export class AppModule {}
```
### Import the module (asynchronous)
```typescript
import { Module } from '@nestjs/common'
import { TurnstileModule } from 'nestjs-cloudflare-turnstile'
@Module({
imports: [
TurnstileModule.forRootAsync({
useFactory: async (configService: ConfigService) => ({
secretKey: configService.get('CAPTCHA_SECRET_KEY'),
token: req => req.headers['captcha-token'],
skipIf: false
}),
}),
],
})
export class AppModule {}
```
## Example separate config for useFactory
If you prefer to keep your configuration logic separate, you can create a dedicated config provider:
```typescript
// /config/turnstile.config.ts
import { ConfigService } from '@nestjs/config'
import type { TurnstileOptions } from 'nestjs-cloudflare-turnstile'
export function getTurnstileConfig(configService: ConfigService): TurnstileOptions {
return {
secretKey: configService.getOrThrow<string>('TURNSTILE_SECRET_KEY'),
token: req => req.body.captcha,
skipIf: false
}
}
```
Then use it in your module:
```typescript
import { Module } from '@nestjs/common';
import { TurnstileModule } from 'nestjs-cloudflare-turnstile';
import { getTurnstileConfig } from '@/config/turnstile.config';
@Module({
imports: [
TurnstileModule.forRootAsync({
imports: [ConfigModule],
useFactory: getTurnstileConfig,
inject: [ConfigService]
}),
],
})
export class AppModule {}
```
## Using the Guard in Controllers
```typescript
import { Controller, Post, Body } from '@nestjs/common';
import { TurnstileCaptcha } from 'nestjs-cloudflare-turnstile';
@Controller('auth')
export class AuthController {
@Post('login')
@TurnstileCaptcha()
login() {
return { success: true };
}
}
```
## Support
If you have any questions or encounter any issues, please don’t hesitate to contact the author or submit an issue in the repository.
- Author: Artur Docenko [(MikroTik2)](https://docenko.vercel.app)
- Contributors:
- Artur Docenko
## License
This project is licensed under the [MIT License](LICENSE).