Webhookã®ä»çµã¿ â ãäœãèµ·ãããç¥ãããŠããå®å šã«åãåã
èªåããå°ããããçžæãç¥ãããã
ãŸãã¯ããèãã«è¡ãããšãç¥ãããŠãããããåãã
æŽæ°ãç¥ãããã«æ¯åå°ããã®ãããŒãªã³ã°ãçžæãå€åã«åãããŠéç¥ããã®ãWebhookã§ããããšãã°ãªããžããªã®æŽæ°ãåããŠãå¥ã®ãµãŒãã¹ãžä»äºãæž¡ããšãã«äœ¿ããŸãã
éç¥ãåããããšãšãäœæ¥ãçµãã£ãããšã¯å¥ã§ããå³ã§ã¯éç¥ãæ€èšŒããŠåãä»ãããšãããŸã§ã瀺ããåŸã®äœæ¥ã¯åããŠããŸãã
å°ãã詊ãïŒæ¬æãå€ãããšçœ²åã¯åããªããªã
Python 3ã䜿ãããªããæ¬¡ãsignature-demo.pyã«ä¿åããpython signature-demo.pyã§å®è¡ããŠã¿ãŸããããç§å¯å€ã¯ãã®å Žã§äœãç·Žç¿çšã®å€ã§ããGitHubãžèšå®ããããå€éšãžéã£ããããäŸã§ã¯ãããŸããã
import hashlib
import hmac
import secrets
secret = secrets.token_bytes(32)
body = b'{"action":"created"}'
received = "sha256=" + hmac.new(
secret, body, hashlib.sha256
).hexdigest()
def verify(raw_body, signature):
expected = "sha256=" + hmac.new(
secret, raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
print(verify(body, received))
print(verify(b'{"action":"deleted"}', received))
True
False
å®éã®GitHubã®éç¥ã§ã¯ãåãåã£ãX-Hub-Signature-256ãšãä¿åããç§å¯å€ã»åä¿¡ããå ã®æ¬æã®ãã€ãåããèšç®ãã眲åãæ¯èŒããŸããJSONãèªã¿çŽããŠäžŠã¹æ¿ããæ¬æã§ã¯ãªããåä¿¡æ¬æããã®ãŸãŸäœ¿ããŸãã眲åããªãå Žåãåãä»ããŸããã
ç·Žç¿ã§ã¯éä¿¡åŽãšåä¿¡åŽãåãããã°ã©ã ã§è¡šããŠããŸããæ¬çªã§ã¯ç§å¯å€ãå®å šã«ç®¡çããæ¯åã©ã³ãã ã«äœãçŽãã®ã§ã¯ãªããéä¿¡åŽãšåä¿¡åŽã§å¯Ÿå¿ããå€ã䜿ããŸããã³ãŒããURLãå ¬éãªããžããªãžç§å¯å€ã眮ããŸããã
åä»ã®è¿äºãšãåŸã®ä»äºãåãã
GitHubã¯2XXã®HTTPå¿çã10ç§ä»¥å ã«è¿ãããšãæ¡å ããŠããŸããããã¯GitHubã®æ¡ä»¶ã§ãããã©ã®ãµãŒãã¹ã«ãåã10ç§ãåœãŠã¯ãããã®ã§ã¯ãããŸããã
æ€èšŒããå¿ èŠãªã€ãã³ãã ãã確å®ã«åãä»ããŠããå¿çããŸããéãä»äºããã¥ãŒãžæž¡ãå Žåãä¿åãç»é²ã倱æããŠãæåå¿çãè¿ãèšèšã«ããªãããšã倧åã§ããåŸã®äœæ¥ã®å€±æã¯ãåä»ã®HTTPå¿çã ãã§ã¯åãããŸããã
ããå°ã詳ããïŒéè€ã»åéã»é çª
- éè€ïŒGitHubã§ã¯X-GitHub-Deliveryã䜿ããåãé éãåŠçæžã¿ã管çã§ããŸããåé éã§ãåãIDãªã®ã§ãéäžã§å€±æããä»äºãå詊è¡ã§ããç¶æ 管çãšåãããŸãã
- åéïŒGitHubã¯å€±æãèªååé éããŸãããå±¥æŽããåé éããããAPIã䜿ã£ãä»çµã¿ã§è£ããŸãã倱æå±¥æŽãšæªå®äºã®ä»äºã確èªããå ¥å£ãçšæããŸãããã
- é çªïŒå±ããé ã ãã§ææ°ç¶æ ãäžæžããããã€ãã³ãã®ä¿èšŒãšçšéã調ã¹ãŸããå¿ èŠãªå Žåã¯APIãã察象ã®ç¶æ ã確èªããŸãã
- æ¥ç¶æ¹åŒïŒWebhookã¯HTTPã®ã€ãã³ãéç¥ã§ããWebSocketãSSEã®ãããªç¶ç¶ããæ¥ç¶ã®æ¹åŒãšã¯åœ¹å²ãéããHTTPã§ãæ¥ç¶ãåå©çšãããå Žåã¯ãããŸãã
ð§ ãã³ã®ã³å çã®ãŸãšãïŒãWebhookãã£ãŠåºãŠããããäœãèµ·ããããæ±ºããURLãžç¥ãããŠãããä»çµã¿ããšæãã°ã ãããOKïŒ
åãä»ããä»äºã¯ã¡ãã»ãŒãžãã¥ãŒãéãæ¹ã®ä¿è·ã¯HTTPãšHTTPSã®éããžé²ããšã€ãªãããŸãã
åèè³æ
- GitHubïŒBest practices for using webhooks â HTTPSã»åä»ã®æéãšå¿çã»ã€ãã³ãã»é éID
- GitHubïŒValidating webhook deliveries â å ã®æ¬æã®HMAC眲åã»ç§å¯å€ã»å®æ°æéã®æ¯èŒ
- GitHubïŒHandling failed webhook deliveries â 倱æã¯èªååéãããªãã»å±¥æŽãšåé é