Helps to protect SPA's (Single Page Applications) against SPAM without using cookies or user input.
composer require hettiger/spa-honeypot
php artisan spa-honeypot:install
- Add the
form.honeypot
,form.token
orform
middleware to a forms target route
Route::post('form', fn () => 'OK')->middleware('form');
The
form
middleware group simply combinesform.honeypot
andform.token
so you don't have to. Using justform.token
protection without theform.honeypot
middleware or vise versa is supported.
- Use one of the corresponding frontend libraries to make form token requests
- Add the
form.token.handle
middleware to thelighthouse.route.middleware
config
// config/lighthouse.php — must be published
'middleware' => [
// …
'form.token.handle',
],
- Register the honeypot scalar in your
graphql/schema.graphql
file
scalar Honeypot @scalar(class: "Hettiger\\Honeypot\\GraphQL\\Scalars\\HoneypotScalar")
# …
- Add a honeypot field to any input that you want to protect against SPAM
input SendContactRequestInput {
# …
honey: Honeypot
}
The
field
config is not being used in GraphQL context.
- Add the
@requireFormToken
directive to any field that you want to protect against SPAM
# e.g. graphql/contact.graphql
extend type Mutation {
sendContactRequest(input: SendContactRequestInput): SendContactRequestPayload @requireFormToken
}
- Use one of the corresponding frontend libraries to make form token requests
You may provide custom error response factories using the config:
return [
// …
'honeypot_error_response_factory' => \Hettiger\Honeypot\ErrorResponseFactory::class,
'form_token_error_response_factory' => \Hettiger\Honeypot\ErrorResponseFactory::class,
];
Alternatively you can provide a simple Closure
anywhere in your application:
use Hettiger\Honeypot\Facades\Honeypot;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
// …
public function boot()
{
$errorResponseFactory = fn (bool $isGraphQLRequest) => $isGraphQLRequest
? ['errors' => [['message' => 'Whoops, something went wrong …']]]
: 'Whoops, something went wrong …';
Honeypot::respondToHoneypotErrorsUsing($errorResponseFactory);
Honeypot::respondToFormTokenErrorsUsing($errorResponseFactory);
}
}
You don't have to worry about adding the form token header yourself. It'll be added for you automatically.
composer test
Please see CHANGELOG for more information on what has changed recently.
The MIT License (MIT). Please see License File for more information.