웹훅 - 파트 II

11399 단어 integrationwebhook
이전 게시물에 이어서 첫 번째 Webhook Provider를 빌드해 보겠습니다.

우리는 Laravel과 Spatie의 패키지Laravel Webhook Server를 사용하여 빌드할 것입니다.

새로운 라라벨 프로젝트 생성



새로운 라라벨 프로젝트를 생성해봅시다:

laravel new webhook-client --git --jet --stack=livewire 
php artisan queue:table
php artisan migrate


패키지 설치 및 구성



패키지를 설치합니다.

composer require spatie/laravel-webhook-server
php artisan vendor:publish --provider="Spatie\WebhookServer\WebhookServerServiceProvider"


기본적으로 Spatie는 config/webhook-server.php에서와 같이 Webhook을 이미 사전 구성했습니다.

<?php

return [
    'queue' => 'default',
    'connection' => null,
    'http_verb' => 'post',
    'signer' => \Spatie\WebhookServer\Signer\DefaultSigner::class,
    'signature_header_name' => 'Signature',
    'headers' => [
        'Content-Type' => 'application/json',
    ],
    'timeout_in_seconds' => 3,
    'tries' => 3,
    'backoff_strategy' => \Spatie\WebhookServer\BackoffStrategy\ExponentialBackoffStrategy::class,
    'verify_ssl' => env('WEBHOOK_VERIFY_SSL', false),
    'throw_exception_on_failure' => false,
    'tags' => [],
];


개발에 관해서는 verify_ssl 끄고 싶습니다. 다음과 같이 설정하여 구성할 수 있습니다.

'verify_ssl` = env('WEBHOOK_VERIFY_SSL', false),


따라서 기본적으로 SSL이 선택 사항인지 확인합니다. 프로덕션 환경에서 활성화하도록 권장하지 않는 한 말입니다.

관심을 가질 수 있는 또 다른 구성은 헤더를 설정하는 것입니다. 이를 통해 페이로드가 사용자로부터 오는 일종의 식별자를 가질 수 있습니다. 다음을 추가하는 것이 좋습니다.

'headers' => [
    'Content-Type' => 'application/json',
    'X-App' => env('APP_NAME'),
    'X-Version' => 1.0
],


다음으로 데이터베이스 큐를 사용하여 .env를 업데이트합니다.

QUEUE_CONNECTION=database


구문



이제 재미있는 부분은 페이로드를 보내는 것입니다. 페이로드를 보내는 것은 문서에 따라 간단한 설정입니다.

WebhookCall::create()
   ->url('https://other-app.com/webhooks')
   ->payload(['key' => 'value'])
   ->useSecret('sign-using-this-secret')
   ->dispatch();


여기에서 볼 수 있듯이 몇 줄의 코드에 불과합니다. 그것을 조금 설명합시다.
url() 메서드는 Webhook Provider로부터 데이터/정보/페이로드를 수신하는 Webhook Consumer 엔드포인트를 제공해야 합니다.
payload()는 Webhook 소비자와 공유하려는 모든 정보인 데이터 배열을 허용합니다.
useSecret()는 Webhook 소비자가 공유할 비밀 키입니다. 따라서 웹후크 소비자가 페이로드를 수신하면 웹후크 공급자가 보낸 서명을 확인합니다.
dispatch() 는 기본적으로 Webhook 소비자에게 정보를 보내기 위해 대기열 작업에 페이로드를 보냅니다. 기본적으로 패키지는 기본 대기열을 사용합니다. config/webhook-server.php에서 이를 구성할 수 있습니다.

페이로드 보내기



이 게시물에서는 Webhook Provider에서 새로 생성된 사용자를 알아야 하는 Webhook 소비자에게 보내겠습니다.

간단하게 app/Models/User.php 에 다음 코드 스니펫을 추가합니다.

public static function boot() {

    parent::boot();

    static::created(function(User $model) {
        WebhookCall::create()
            ->url(url('webhook/handler'))
            ->payload($model->toArray())
            ->throwExceptionOnFailure()
            ->useSecret('sign-using-this-secret')
            ->dispatch();
    });
}


위의 코드는 기본적으로 새로 생성된 사용자에 대한 정보를 url('webhook/handler') 로 호출하고 제공된 비밀 키를 사용하여 Webhook Consumer로 전송이 실패할 경우 예외를 발생하도록 설정합니다.

데이터를 Webhook Consumer로 보내는 것이 전부입니다.

페이로드 처리



이 Webhook 제공이 작동한다는 것을 입증하기 위해 동일한 Laravel 앱에서 페이로드를 수신할 것입니다.
routes/web.php에서 새 경로 만들기

Route::post('webhook/handler', function(Request $request) {
    logger()->info([
        'payload' => $request->all(),
        'headers' => $request->headers,
    ]);
});


그런 다음 CSRF 토큰 확인을 비활성화해야 합니다.

protected $except = [
    'webhook/handler'
];


웹후크 테스트



이제 웹후크를 테스트해 보겠습니다.

# Run in first terminal
php artisan serve
# Run in second terminal
php artisan queue:work


URLhttp://localhost:8000을 방문하여 등록하십시오.

등록이 완료되면 storage/logs/laravel.log 를 엽니다. 다음과 같은 내용이 표시되어야 합니다.

[2022-07-12 03:03:17] local.INFO: array (
  'payload' => 
  array (
    'name' => 'Kirby Porter',
    'email' => '[email protected]',
    'updated_at' => '2022-07-12T02:59:03.000000Z',
    'created_at' => '2022-07-12T02:59:03.000000Z',
    'id' => 5,
    'profile_photo_url' => 'https://ui-avatars.com/api/?name=K+P&color=7F9CF5&background=EBF4FF',
  ),
  'headers' => 
  Symfony\Component\HttpFoundation\HeaderBag::__set_state(array(
     'headers' => 
    array (
      'host' => 
      array (
        0 => '127.0.0.1:8000',
      ),
      'user-agent' => 
      array (
        0 => 'GuzzleHttp/7',
      ),
      'content-type' => 
      array (
        0 => 'application/json',
      ),
      'x-app' => 
      array (
        0 => 'Laravel',
      ),
      'x-version' => 
      array (
        0 => '1',
      ),
      'signature' => 
      array (
        0 => '665fcd8bd35088d46d577865ad1e2aa5e6ac51c8e1ea7cdc83cc700eec0d19c2',
      ),
      'content-length' => 
      array (
        0 => '240',
      ),
    ),
     'cacheControl' => 
    array (
    ),
  )),
)  


축하합니다! Webhook 서버를 성공적으로 설정했습니다!

다음으로 Webhook Consumer 애플리케이션을 설정하겠습니다. 자세한 내용은 Webhook: Part III를 참조하세요.

좋은 웹페이지 즐겨찾기