署名
CrewGear からの送信であることを確かめるための署名の作り方と、検証の手順です。
署名の作り方
tは送信した時刻の UNIX 秒です。- 署名する文字列は、
tと本文の生の文字列を.でつないだ`${t}.${本文}`です。 sigは、シークレットキーを鍵とした HMAC-SHA256 の値を、16進の小文字で表したものです。- ヘッダーの
X-Webhook-Signature: t=<t>,v1=<sig>と、クエリのwebhook_t=<t>とwebhook_sig=<sig>に、同じ値を載せます。ヘッダーを読めない受信環境でも、クエリで検証できます。
シークレットキーそのものは送りません。
検証の手順
- ヘッダーから
tとsigを取り出します。ヘッダーを読めないときはクエリから取り出します。 tと受け取った時刻の差が、許容する範囲を超えていたら拒否します。- 受け取った本文を、JSON として解釈する前の生の文字列のまま使って
`${t}.${本文}`を作り、シークレットキーで HMAC-SHA256 を計算します。 - 計算した値と
sigを、比べる時間が値によって変わらない方法で照合し、一致しなければ拒否します。 - 同じ
idをすでに処理していたら、無視します。まれに同じ変更が重ねて届くことがあるためです。