Skip to content

Instantly share code, notes, and snippets.

@ganglio
Created December 15, 2016 12:12
Show Gist options
  • Save ganglio/c7cdd8c54270117236dacffe918db00b to your computer and use it in GitHub Desktop.
Save ganglio/c7cdd8c54270117236dacffe918db00b to your computer and use it in GitHub Desktop.
µ - APIs with HMAC

µ - APIs with HMAC

It is a microapp to handle routing with HMAC signature. Pretty tiny.

Start

$ SEC=secret php -S 0.0.0.0:1337 mu.php

Query

$ curl http://127.0.0.1:1337/hello/ganglio\?SIG\=3704c89159adabf4b487ec1507a81ca00c9180e0d18e7d5f2be27c7cb252bb72
<?php
if (
file_exists(__DIR__ . $_SERVER['REQUEST_URI']) &&
!is_dir(__DIR__ . $_SERVER['REQUEST_URI'])
) {
return false;
}
$secret = getenv("SEC");
@$signature = $_SERVER['HTTP_SIG'] || $_REQUEST['SIG'];
@$method = $_SERVER['REQUEST_METHOD'];
@$path = $_SERVER['REQUEST_URI'];
@$body = file_get_contents('php://input');
$expected = hash_hmac("sha256",$method . $path . $body, $secret);
if ($expected != $signature) {
die("Invalid signature $expected");
}
parse_str(explode("?",$path)[1],$args);
$path = explode("?",$path)[0];
$routes = [
"/hello/{world}" => function ($world) use ($args) { echo "Hello, $world!"; }
];
foreach ($routes as $route=>$methods) {
$regex = "/^" . str_replace("/", "\/",
preg_replace("/(\{[^}]*\})/", "(.*)", $route)
) . "$/";
if (preg_match($regex, $path, $params)) {
unset($params[0]);
if (is_callable($methods)) {
call_user_func_array($methods, $params);
die();
} else if (isset($methods[$method])) {
call_user_func_array($methods[$method], $params);
die();
}
}
}
header("HTTP/1.0 404 Not Found");
die();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment