Google recaptcha module
The NestJS module to protect your endpoints via google recaptcha.
Usage example here
Installation
$ npm i @nestlab/google-recaptcha
Configuration
@Module({
imports: [
GoogleRecaptchaModule.forRoot({
secretKey: process.env.GOOGLE_RECAPTCHA_SECRET_KEY,
response: req => req.headers.recaptcha,
skipIf: process.env.NODE_ENV !== 'production',
useRecaptchaNet: false,
agent: null
})
],
})
export class AppModule {
}
Configuration options
Property | Type | Description |
---|
secretKey | string | Required. Google recaptcha secret key |
response | (request) => string | Required. Function that returns response (recaptcha token) by request |
skipIf | boolean | (request) => boolean | Promise<boolean> | Optional. Function that returns true if you allow the request to skip the recaptcha verification. Useful for involing other check methods (e.g. custom privileged API key) or for development or testing |
useRecaptchaNet | boolean | Optional. If your server has trouble connecting to https://www.google.com. You can use https://recaptcha.net instead, just set true |
agent | https.Agent | Optional. If you need to use an agent |
If you want import configs from your ConfigService via custom getter function that will return GoogleRecaptchaModuleOptions
object.
@Module({
imports: [
GoogleRecaptchaModule.forRootAsync({
imports: [ConfigModule],
useFactory: (configService: ConfigService) => configService.googleRecaptchaOptions,
inject: [ConfigService],
})
],
})
export class AppModule {
}
Usage
Use @Recaptcha
decorator to protect your endpoints.
@Controller('feedback')
export class FeedbackController {
@Recaptcha()
@Post('send')
async send(): Promise<any> {
}
}
You can override default property that contain recaptcha for specific endpoint.
@Controller('feedback')
export class FeedbackController {
@Recaptcha(req => req.body.recaptha)
@Post('send')
async send(): Promise<any> {
}
}
If you want use google recaptcha guard in combination with another guards then you can use @UseGuards
decorator.
@Controller('feedback')
export class FeedbackController {
@UseGuards(Guard1, GoogleRecaptchaGuard, Guard2)
@Post('send')
async send(): Promise<any> {
}
}
Error handling
Google recaptcha guard will throw GoogleRecaptchaException on error.
GoogleRecaptchaException
has data with google recaptcha error codes.
GoogleRecaptchaException
← HttpException
← Error
.
You can handle it via ExceptionFilter.
Example exception filter implementation.
@Catch(GoogleRecaptchaException)
export class GoogleRecaptchaFilter implements ExceptionFilter {
catch(exception: GoogleRecaptchaException, host: ArgumentsHost): any {
}
}
And add your filter to application
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new ErrorFilter(), new GoogleRecaptchaFilter());
await app.listen(3000);
}
bootstrap();
Enjoy!