Webhook を利用して通知を受け取る

🚧

こちらの機能はリリース前のβ機能となります

導入を検討されているお客様は営業担当までお問い合わせください。
また、今後予告なく仕様変更を伴う機能改善が行なわれる可能性があります。ご了承ください。

事前準備

以下の条件を満たす KARTE Apps を作成しておく

  • 対象となる Webhook が登録されている

エンドポイントの実装例

Message Webhook の場合

ユーザーのメッセージを受け取る をご確認ください。

Assign Webhook の場合

ユーザーの担当者変更情報を受け取る をご確認ください。

HMAC Signature を付与した場合

assign webhook を例に、リクエストの送信元が KARTE であることを確認した後、webhook の内容を出力するサンプルコードを記載します。

const crypto = require('crypto');

const HMAC_ALGORITHM = 'sha256';
const CLIENT_ID = 'B5iJ+5SFT6EjYJiRMnjALqH84NOQCRYm';
const CLIENT_SECRET_KEY = 'NSWShy21RYUDCdbV5iLtjryR0vxWOo4W';

app.post('/hook/assign', function(req, res) {
  const userAgent = req.get('User-Agent');
  if (!userAgent || userAgent !== 'KARTE-Service-Account-Webhook/1.0') {
    throw new Error('Invalid User-Agent');
  } // User-Agentの確認
  
  const authHeader = req.get('Authorization');
  if (!authHeader || authHeader.indexOf('KARTE-HMAC-SHA256') === -1) {
    throw new Error('Missing authorization header');
  } // Autorizationが存在し、KARTE-HMAC-SHA256と記載があることを確認

  const hmacSignature = authHeader.split(' ')[1];
  const [credential, timestamp, signature] = hmacSignature.split(',');
  const calculatedHMAC = crypto
    .createHmac(HMAC_ALGORITHM, CLIENT_SECRET_KEY)
    .update(JSON.stringify(req.body))
    .digest('base64');

  if (credential !== `Credential=${CLIENT_ID}` || signature !== `Signature=${calculatedHMAC}`) {
    throw new Error('Invalid hamc signature');
  } // HMAC署名の確認
  
  const timestampFromKarte = Date.parse(timestamp.replace('Timestamp=', ''));
  if (new Date() - timestampFromKarte > 60 * 5 * 1000) {
    throw new Error('The request timestamp is more than five minutes from local time');
  } // Timestampの確認

  const {api_key, user_id, assignee} = req.body;

  console.log(api_key) // api key
  console.log(user_id) // user id
  console.log(assignee) // assignee

  // do something
});