はじめに
これまで何度かansible.eda.webhook
イベントソースプラグインを使って、Webhook 経由で何かを動かすということを試してみました。
このイベントソースプラグインは認証機能を持たせることもできるので、トークンによる認証を試してみました。
Rulebook
以下のような Rulebook を利用します。
ポイントは token
オプションです。
--- - name: Hello Events hosts: all sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 token: 72232ecb-8b5f-15ed-5d28-597840a98608 # ポイント rules: - name: Say Hello condition: event.payload is defined action: debug: msg: "{{ event }}"
ここでは分かりやすさのためにべた書きしていますが、本来は変数化したほうがよいと思います。
リクエストおためし
EDA Controller で上記 Rulebook を利用したアクティベーションを作成し、さっそくリクエストを試します。
認証 OK 例
リクエスト:
curl -X POST http://192.168.1.144:5000/endpoint \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer 72232ecb-8b5f-15ed-5d28-597840a98608' \ -d '{"message": "sakana"}'
レスポンス:
endpoint
ansible.eda.webhook
の仕様として、エンドポイントの文字列がレスポンスの body になります。
認証 NG 例
せっかくなので、認証が正常でないパターンもためします。
なお、HTTP ステータスコードはすべて 401
で、アクティベーションのログとしては以下のようなログになります。
2023-08-08 12:31:05,530 - aiohttp.access - INFO - 10.0.2.100 [08/Aug/2023:12:31:05 +0000] "POST /endpoint HTTP/1.1" 401 188 "-" "curl/7.88.1"
Authorization
ヘッダーフィールドなし
リクエスト:
curl -X POST http://192.168.1.144:5000/endpoint \ -H 'Content-Type: application/json' \ -d '{"message": "sakana"}'
レスポンス:
401: Missing authorization token
トークン間違い
リクエスト:
curl -X POST http://192.168.1.144:5000/endpoint \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer xxinvalidxx' \ -d '{"message": "sakana"}'
レスポンス:
Invalid authorization token
Basic 認証(未サポート)
リクエスト:
curl -X POST http://192.168.1.144:5000/endpoint \ -H 'Content-Type: application/json' \ -H 'Authorization: Basic hogehoge' \ -d '{"message": "sakana"}'
レスポンス:
Only Bearer type is accepted
おわりに
ansible.eda.webhook
イベントソースプラグインを、トークンによる認証とあわせて使ってみました。認証なしの Webhook を許可させたくないときには便利そうです。
今回の token
に指定するような値を管理するための、認証情報の機能を作るのはどうかという issue がありました。