Noteビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。ビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。JavaScript@hayasshi_です。Scalaのプロダクトを開発しています。チャットワークのWebhookがリリースされました!🎉OAuthとあわせて、様々なサービスがチャットワークと連携しやすくなります。今日はチャットワークのWebhookの署名検証について少しお話します。Webhookの署名検証チャットワークのWebhookは、イベントに応じてチャットワークからHTTPリクエストが行われ、それを連携先のサービスで受け付けていただく必要があります。万一リクエスト先のURLが漏れてしまった場合、チャットワークになりすましてHTTPリクエストを送ることができてしまいます。そこでチャットワークのWebhookでは、Webhookの設定毎にトークン(署名検証用の秘密鍵)を発行し、それをつかってHTTPリクエストがチャットワークからであるということを検証していただくことができます。(詳細は公式ドキュメントを参照してください。)この記事では、各言語での署名検証のサンプルコードをご紹介したいと思います。準備するものWebhookの設定で発行された署名検証用トークンWebhookの設定編集画面で確認できますWebhookのHTTPリクエストボディお使いのWebアプリケーションフレームワークなどのAPIをつかって、リクエスト毎に取得してください注意点として、リクエストされてきたそのままの文字列を取得してください例えば一度Jsonデシリアライズしたものをもう一度シリアライズするなどすると、フィールドの順番がいれかわったり、スペースがトリムされたりなど、元のリクエストボディの値と差異が出てしまう可能性がありますWebhookのHTTPリクエストヘッダX-ChatWorkWebhookSignatureの値お使いのWebアプリケーションフレームワークなどのAPIをつかって、リクエスト毎に取得してください今回は各言語での署名検証のコードのみにフォーカスするため、トークン等は下記にて準備されたものを利用します。WebhookのHTTPリクエストヘッダ`X-ChatWorkWebhookSignature`の値G7Gtrh5Ee6d8erOVXhWPtUrkNJqqIT5vwLU50KhyLQk=チャットワークのWebhookは、主に下記の2つのことができるAPIが標準ライブラリにあればごく簡単に扱うことができます。Base64エンコード・デコードHMAC-SHA256でのメッセージダイジェストの作成それではどんどんいってみましょう。PHP弊社ではまだまだPHPのプロダクトが多く、一緒に改善してくれるエンジニアを募集しています。(突然の告知)そんなPHPでの検証コードです。環境は以下のバージョンの対話ツールで確認しました。1とくに嵌まるところはありませんでしたが、hash_hmac関数の第四引数にTRUEを指定して生のバイナリデータを取得した上で、Base64エンコードしないと結果が変わってしまうことに注意が必要です。Java弊社ではScalaエンジニアも(ryJavaの標準ライブラリを利用しているので、JVM系の言語であれば同じように記載が可能と思われます。Javaのバージョンは、オラクルのjdk1.8.0の環境で確認しました。}}java.util.Base64がJDK1.8から導入されたので楽に実装できました。(Node.js)弊社(ry最近はNode.jsを用いたWebサービスも増えてきました。弊社でもツール等で利用することがあります。環境は以下のバージョンの対話ツールで確認しました。true普段JavaScript(Node.js)を書くことが少ないので、Base64のデコード方法にまよったりしましたが、なんとかかけました。メッセージダイジェストの作成は下記のドキュメントが分かりやすかったです。ScriptではNode.jsと環境が異なるため、以下の記事を参照ください。NoteRuby環境は以下のバージョンの対話ツール(irb)で確認しました。Base64.decode64を利用していたため、最後の比較で失敗していました。Base64.strict_decode64を利用しないと、改行が挿入されてしまうようです。Go私事ですが、この署名検証のコードが私のGo入門でした。Playgroundで確認しました。true}こちらも特に問題なく、公式のAPIリファレンスを参考に書くことができました。まとめどの言語も標準ライブラリをつかってごく簡単に検証することが可能でした。ColaboratoryでMidJourneyライクなAIアート体験...こんにちは!お絵描きできるエンジニアのcw-ozakiです。以下の記事に引...2018-10-29IFTTT対応と開発についてこんにちは、サーバーサイド開発部の原田です。前回はこちらの...2018-06-08ダイレクトチャットでToがなくてもWebhookのイベントが送信されるようになりました!こんにちは、サーバサイド開発部のcw-hirataです。@Chatwork_devメンバーid:cw-oritaid:okuzawatsid:d-hayashiid:shibe23id:cw-jeromechaid:cw-araiid:tinpayid:cw-sakamotoid:rabe1028id:cw-suetakeid:lmdexprid:cw-shinyaid:cw-takaseid:cw-niinumaid:j5ik2oid:tan-yukiid:yamakenji24id:yoshiyoshifujiiid:cw-ayumitakahashiid:cw-furuyaid:kaz3284id:cw-ozakiid:cw-nishikawaid:daiksyid:tasuku43id:louvre2489id:sykt13id:yamatomo73id:cw-kasugaid:cw-mottyid:cw-nishiguchiid:s12btid:cw-sayamaid:cw-moriyaid:cw-makotoikedaid:cw-yoheihayashiid:wakakumaid:cw-sakaguchiid:cw-matsubaid:ymgnid:shige0501id:nottegraid:shinharadid:eielid:cw-michihiroid:crossroad0201id:cw-miyashitaid:agoetcid:at-akaid:cw-chibaid:tenslerid:cw-akatsuid:cw-kajiwaraid:cw-otakeid:TomokoNishinaid:cw-tanakaid:cw-hayashiid:cw-marikoid:cw-shinmenid:cw-masakiid:cw-hayama最新記事モバイルアプリ開発チーム、カンバンはじめました。(1)引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。