Installation:
composer require br/signed-request-bundle
Add to config/bundles.php:
Baldurrensch\SignedRequestBundle\BaldurrenschSignedRequestBundle::class => ['all' => true],
Configuration:
Add to config/packages/baldurrensch_signed_request.yaml:
baldurrensch_signed_request:
salt: '%env(SIGNED_REQUEST_SALT)%' # Store this securely in .env
verify_request: true
sign_response: true
First Use Case:
X-SignedRequest header to requests with:
const signature = md5(requestUri + JSON.stringify(requestBody) + salt);
headers['X-SignedRequest'] = signature;
Request Verification:
verify_request: true to enforce signed requests globally./**
* @Route("/public", name="public_route")
* @SignedRequest(verify=false)
*/
public function publicAction() { ... }
Response Signing:
sign_response: true to auto-sign all responses.Signer service:
services:
baldurrensch_signed_request.signer:
class: App\Service\CustomSigner
arguments: ['%baldurrensch_signed_request.salt%']
tags: ['baldurrensch_signed_request.signer']
API Integration:
use Baldurrensch\SignedRequestBundle\EventListener\RequestListener;
public function webhookAction(Request $request) {
$listener = $this->container->get('baldurrensch_signed_request.request_listener');
if (!$listener->isRequestValid($request)) {
throw new \RuntimeException('Invalid signature');
}
// Process request...
}
Custom Headers:
X-SignedRequest header via config:
baldurrensch_signed_request:
signature_header: 'X-Custom-Signature'
Salt Management:
salt must be kept secret (e.g., in .env). Never commit it to version control.Case Sensitivity:
X-SignedRequest) are case-insensitive in HTTP, but the bundle enforces exact matching. Avoid typos in config.Content-Type Dependencies:
Content-Type: application/json for request signing. For other formats (e.g., form-data), extend the RequestListener:
public function isRequestValid(Request $request) {
if ($request->getContentType() === 'application/x-www-form-urlencoded') {
$content = $request->request->all();
}
// Custom logic...
}
Performance:
Debugging:
baldurrensch_signed_request:
debug: true
signed_request events.Testing:
RequestListener in PHPUnit:
$listener = $this->createMock(RequestListener::class);
$listener->method('isRequestValid')->willReturn(true);
$this->container->set('baldurrensch_signed_request.request_listener', $listener);
Partial Signing:
baldurrensch_signed_request:
verify_request: false # Default off
Then enable signing for critical routes via annotations.Non-Symfony Projects:
Signer class and adapting it to Laravel’s request/response objects.Security:
Extending:
Signer class to use HMAC-SHA256 instead of MD5:
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class CustomSigner extends Signer {
protected function sign($content) {
return hash_hmac('sha256', $content, $this->salt);
}
}
How can I help you explore Laravel packages today?