Laravel Middleware 实作 Signature Verification

延续昨天,我们来看可以怎麽在 Laravel 框架下实作签证的验证。

What is middleware?

有点像 pipe 可以一个串一个去处理请求。例如,我们可以让请求都先做 authentication 通过後才做进一步处理。当然我们也可以自定义一些客制化的流程,例如 verify signature。

范例

以下就以验证签章为例来实作 Laravel middleware

  1. 新增 middleware
$ php artisan make:middleware VerifySignature
  1. 验证的具体逻辑
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);
    }
}
  1. 注册自定义 middleware
// 编辑 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
];
  1. 最後在 web routes 使用

可以直接这样使用

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,最新的写法请参阅官方文件

Reference


<<:  前言

>>:  【心得】你今天青蛙了吗? Flex之路-align-items vs. align-content 傻傻分不清楚

Day 27 RSpec 的 Mock & Stub

该文章同步发布於:我的部落格 在我一开始学习写 Rails 测试时,会有很常见的问题,就是到底什麽...

【Day8】EditProfileFragment X Storage上传照片

在昨天的Profile页面中,我们可以看到有照片的讯息,那我们今天主要要来做的就是~ 把手机相簿里...

深呼吸、喘口气,所以你这麽努力是要往哪里去?(拼命努力,不好吗? )

周慕姿x邓惠文 聊《过度努力》、《我想看你变老的样子》 今天看到《过度努力》这本书,一路找到这个访谈...

[NestJS 带你飞!] DAY01 - 简介

近年来,前後端都可以看到 JavaScript 的踪影,Node.js 的诞生让 JavaScrip...

DAY 28- BIP32- HD wallet

「BIP BIP BIP 」 BIP 由於区块链没有一个中心系统,在协议上没有办法由中心统一更新, ...