延续昨天,我们来看可以怎麽在 Laravel 框架下实作签证的验证。
有点像 pipe 可以一个串一个去处理请求。例如,我们可以让请求都先做 authentication 通过後才做进一步处理。当然我们也可以自定义一些客制化的流程,例如 verify signature。
以下就以验证签章为例来实作 Laravel middleware
$ php artisan make:middleware VerifySignature
class VerifySignature
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// 对方的 signature 放在 header
$signature = $request->headers->get('X-Signature');
$body = $request->getContent();
if ($signature !== hash_hmac('sha256', $body, config('klk.secret'))) {
// 如果验证失败简单回覆个讯息
$body = [
"code" => 401,
"message" => "signature error",
"timestamp" => date('Y-m-d H:i:s')
];
return response(json_encode($body), 401)->header('Content-Type', 'application/json');
}
return $next($request);
}
}
// 编辑 App\Http\Kernel
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
// 新增我们的 middleware,key 看要取什麽名字都可以
'verify.signature' => \App\Http\Middleware\VerifySignature::class
];
可以直接这样使用
Route::middleware('verify.signature')->post('webhook/handler', 'WebhooksController@handle');
也可以用 group,因为可能多支 webhook 都要通过同样的签章验证
Route::middleware('verify.signature')->group(function () {
// Route::post();
// Route::post();
// Route::post();
// ...
});
注意!上面 routes 写法是 Laravel 7,最新的写法请参阅官方文件
>>: 【心得】你今天青蛙了吗? Flex之路-align-items vs. align-content 傻傻分不清楚
该文章同步发布於:我的部落格 在我一开始学习写 Rails 测试时,会有很常见的问题,就是到底什麽...
在昨天的Profile页面中,我们可以看到有照片的讯息,那我们今天主要要来做的就是~ 把手机相簿里...
周慕姿x邓惠文 聊《过度努力》、《我想看你变老的样子》 今天看到《过度努力》这本书,一路找到这个访谈...
近年来,前後端都可以看到 JavaScript 的踪影,Node.js 的诞生让 JavaScrip...
「BIP BIP BIP 」 BIP 由於区块链没有一个中心系统,在协议上没有办法由中心统一更新, ...