Проверка HMAC с использованием SecurityServiceProvider с Silex

Я отправляю hmac по URL, который хочу подтвердить, прежде чем разрешить пользователям доступ к системе. Пользовательской базы данных нет, поэтому она просто проверяет параметры url на достоверность того, что она была сгенерирована правильным сервером, и пользователи не могут изменять эти параметры для доступа к другим частям системы.

Мне интересно, если кто-нибудь сделал что-то подобное с SecurityServiceProvider. Я могу сделать это, используя промежуточное программное обеспечение before, которое запускается после правил маршрутизации и брандмауэра безопасности. Я хотел бы остановить этот запрос на брандмауэре, если это возможно.

1 ответ

Я решил использовать функцию промежуточного программного обеспечения Silex "до". Я уверен, что это, вероятно, не лучший способ добиться этого, но в моем приложении нет пользователей или аутентификации, поэтому мне просто нужно проверить, правильно ли указан ключ, и вернуть ответ. Если у кого-то есть какие-либо комментарии по улучшению этого, я хотел бы услышать их.

Когда внешняя система генерирует 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.");
});
Другие вопросы по тегам