silex のミドルウェア機能「before」を使用することにしました。これはおそらく最善の方法ではないと確信していますが、私のアプリにはユーザーまたは認証がないため、キーが正しいことを確認して応答を返すだけで済みます。これを改善するためのコメントがあれば、ぜひ聞きたいです。
外部システムが URL を生成する場合、構成ファイルで定義され、$app['config']['hmac_key'] からアクセスできる共有秘密鍵を使用する必要があります。hmac は、パス内の hmac の後のすべてに対して生成されます。したがって、サブフォルダー domain.com/folder/hmac/arg1/arg2/arg3 を取得した場合。before フィルターはルートを hmac で分割し、その後にパスを構築します。
// Before firing the controller check the hmac matches, otherwise return 403.
$app->before(function (Request $request) use ($app) {
// 40 chars in a sha1 hmac hash
if(!preg_match('/^[0-9a-f]{40}$/i', $request->get('hmac')))
$app->abort(403, "Invalid key.");
// break the route down to the arguments used in hmac
$route = explode('hmac_', $request->get('_route'));
$route = explode('_',$route[1]);
// build the path used to generate hmac
$path = array();
foreach($route as $r)
if($v = $request->get($r))
$path[] = $v;
$path = implode('/', $path);
// Generate hmac hash from path and key
$hmac = hash_hmac("sha1", $path, $app['config']['hmac_key']);
// If the hmac's don't match return 403
if($hmac !== $request->get('hmac'))
$app->abort(403, "Invalid key.");
});