ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã«ã€ããŠ
Note
æå¹æéãåãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯çŸåšãªãã·ã§ã³ã®æ©èœã§ããã倿Žãããå¯èœæ§ããããŸãã ããŒã¯ã³æå¹æéæ©èœã®ãªããã€ã³ãŸãã¯ãªããã¢ãŠãã«ã€ããŠã¯ããGitHub ã¢ããªã®ãªãã·ã§ã³æ©èœã®ã¢ã¯ãã£ãåããã芧ãã ããã 詳现ã«ã€ããŠã¯ããGitHub App ã®ãŠãŒã¶ãŒãããµãŒããŒãžã®ã¢ã¯ã»ã¹ããŒã¯ã³ã®æéåãããåç §ããŠãã ããã
GitHub App ãæ¿èªããåŸã«èªåã® Organization ã§ææããŠãããªãœãŒã¹ã衚瀺ã§ããªãããšããŠãŒã¶ãŒããå ±åããããã® Organization ã§ SAML SSO ã䜿çšããŠããå ŽåãåèªèšŒããåã«ãOrganization ã®ã¢ã¯ãã£ã㪠SAML ã»ãã·ã§ã³ãéå§ããããã«ãŠãŒã¶ãŒã«æç€ºããŸãã 詳现ã«ã€ããŠã¯ãGitHub Enterprise Cloud ããã¥ã¡ã³ãã®ãSAML ãš GitHub Appsããåç §ããŠãã ããã
ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ãOAuth ããŒã¯ã³ã®äžçš®ã§ãã åŸæ¥ã® OAuth ããŒã¯ã³ãšã¯ç°ãªãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã«ã¹ã³ãŒãã¯äœ¿çšãããŸããã 代ããã«ããã现ããã¢ã¯ã»ã¹èš±å¯ã䜿çšãããŸãã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿çšãããšããŠãŒã¶ãŒãšã¢ããªã®äž¡æ¹ãæã£ãŠããã¢ã¯ã»ã¹èš±å¯ã®ã¿ãä»äžãããŸãã ããšãã°ãã¢ããªã«ãªããžããªã®å å®¹ãæžã蟌ãã¢ã¯ã»ã¹èš±å¯ãä»äžãããŠããŠãããŠãŒã¶ãŒã«ã§ããããšãå 容ã®èªã¿åãã ãã§ããå ŽåããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¯ã³ã³ãã³ãã®èªã¿åãã®ã¿ãè¡ãããšãã§ããŸãã
åæ§ã«ããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¢ã¯ã»ã¹ã§ããã®ã¯ããŠãŒã¶ãŒãšã¢ããªã®äž¡æ¹ã§ã¢ã¯ã»ã¹ã§ãããªãœãŒã¹ã®ã¿ã§ãã ããšãã°ãã¢ããªã«ãªããžã㪠A ãš B ãžã®ã¢ã¯ã»ã¹æš©ãä»äžãããŠããŠããŠãŒã¶ãŒããªããžã㪠B ãš C ã«ã¢ã¯ã»ã¹ã§ããå ŽåããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ãªããžã㪠B ã«ã¯ã¢ã¯ã»ã¹ã§ããŸãããA ãŸã㯠C ã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã REST API ã䜿çšããŠããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¢ã¯ã»ã¹ã§ããã€ã³ã¹ããŒã«ãšã€ã³ã¹ããŒã«å
ã®ãªããžããªã確èªã§ããŸãã 詳现ã«ã€ããŠã¯ããGitHub Appã€ã³ã¹ããŒã«çš REST API ãšã³ããã€ã³ããã®ãGET /user/installationsããšãGET /user/installations/{installation_id}/repositoriesããåç
§ããŠãã ããã
ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿çšã㊠API èŠæ±ãè¡ãå ŽåããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®ã¬ãŒãå¶éãé©çšãããŸãã 詳ããã¯ããRate limits for GitHub Apps (GitHub ã¢ããªã®ã¬ãŒãå¶é)ããã芧ãã ããã
æ¢å®ã§ã¯ããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ 8 æéåŸã«æéåãã«ãªããŸãã æŽæ°ããŒã¯ã³ã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãåçæã§ããŸãã 詳ããã¯ãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãæŽæ°ããããã芧ãã ããã
ãŠãŒã¶ãŒã¯ãGitHub App ã®èªå¯ãåãæ¶ãããšãã§ããŸãã 詳ããã¯ããããŒã¯ã³ã®æå¹æéãšåãæ¶ãããã芧ãã ããã ãŠãŒã¶ãŒã GitHub App ã®èªå¯ãåãæ¶ããšãã¢ããªã¯ github_app_authorization Webhook ãåãåããŸãã GitHub Apps ã¯ããã®ã€ãã³ãããµãã¹ã¯ã©ã€ãè§£é€ã§ããŸããã ã¢ããªããã® Webhook ãåãåã£ãå Žåã¯ãããŒã¯ã³ãåãæ¶ãããŠãŒã¶ãŒã«ä»£ãã£ãŠè¡ã API ã®åŒã³åºãã忢ããå¿
èŠããããŸãã åãæ¶ãããã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿ãç¶ãããšãã¢ããªã¯ 401 Bad Credentials ãšã©ãŒãåãåãããšã«ãªããŸãã ãã® Webhook ã®è©³çްã«ã€ããŠã¯ããWebhook ã®ã€ãã³ããšãã€ããŒãããåç
§ããŠãã ããã
ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãšæŽæ°ããŒã¯ã³ã¯ã»ãã¥ãªãã£ä¿è·ããå¿ èŠããããŸãã 詳ããã¯ããGitHub App ãäœæããããã®ãã¹ã ãã©ã¯ãã£ã¹ããã芧ãã ããã
Web ã¢ããªã±ãŒã·ã§ã³ ãããŒã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæãã
ã¢ããªããã©ãŠã¶ãŒã§å®è¡ãããŠããå Žåã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ ãããŒã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæããå¿ èŠããããŸãã Web ã¢ããªã±ãŒã·ã§ã³ ãããŒã®äœ¿çšã«é¢ãããã¥ãŒããªã¢ã«ã«ã€ããŠã¯ããGitHub App ã䜿ã£ãŠ [Login with GitHub] ãã¿ã³ãäœæããããåç §ããŠãã ããã
-
ãã® URL ã«ãŠãŒã¶ãŒãèªå°ããæ¬¡ã®ãã©ã¡ãŒã¿ãŒã®äžèЧããå¿ èŠãªã¯ãšãª ãã©ã¡ãŒã¿ãŒã远å ããŸã:
http(s)://HOSTNAME/login/oauth/authorizeã ããšãã°ããã® URL ã§ã¯ãclient_idãã©ã¡ãŒã¿ãŒãšstateãã©ã¡ãŒã¿ãŒãæå®ããŸã:http(s)://HOSTNAME/login/oauth/authorize?client_id=12345&state=abcdefgãQuery parameter (ã¯ãšãª ãã©ã¡ãŒã¿ãŒ) Type å¿ é 説æ client_idstringå¿ é GitHub App ã®ã¯ã©ã€ã¢ã³ã IDã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ã㪠ID ãšã¯ç°ãªããŸãã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ããªã®èšå®ããŒãžã§ç¢ºèªã§ããŸãã GitHub App ã® [Settings] ããŒãžã«ç§»åããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã redirect_uristringåŒ·ãæšå¥š èªå¯ã®åŸã«ãŠãŒã¶ãéãããã¢ããªã±ãŒã·ã§ã³äžã®URLã ããã¯ãã¢ããªã®èšå®ã§ "ã³ãŒã«ãã㯠URL" ãšããŠæå®ãã URL ã®ã©ãããšå®å šã«äžèŽããŠããå¿ èŠãããã远å ã®ãã©ã¡ãŒã¿ãŒãå«ããããšã¯ã§ããŸããã statestringåŒ·ãæšå¥š æå®ããå Žåãå€ã«ã¯åœé æ»æããä¿è·ããã©ã³ãã ãªæååãå«ãŸããŠããå¿ èŠããããŸãããŸããä»ã®ä»»æã®ããŒã¿ãå«ããããšãã§ããŸãã loginstringçç¥å¯èœ æå®ãããšããµã€ã³ã€ã³ãšã¢ããªã®æ¿èªã«äœ¿çšã§ããç¹å®ã®ã¢ã«ãŠã³ããæã€ãŠãŒã¶ãŒã« Web ã¢ããªã±ãŒã·ã§ã³ ãããŒã§ããã³ããã衚瀺ãããŸãã allow_signupbooleançç¥å¯èœ OAuth ãããŒã®éã«ãèªèšŒãããŠããªããŠãŒã¶ãŒã«å¯ŸããŠGitHub ãžã®ãµã€ã³ã¢ããã®éžæè¢ãæç€ºããããã©ããã æ¢å®å€ã¯ã trueã§ãã ããªã·ãŒã§ãµã€ã³ã¢ãããçŠæ¢ãããŠããå Žåã¯ãfalseã䜿çšããŸãã -
ãŠãŒã¶ãŒãèªå¯èŠæ±ãåãå ¥ããå ŽåããŠãŒã¶ãŒã¯ GitHub ã§ã¢ããªèšå®ã®ã³ãŒã«ãã㯠URL ã®ã©ããã«ãªãã€ã¬ã¯ããããæ¬¡ã®æé ã§ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãäœæããããã«äœ¿çšã§ãã
codeã¯ãšãª ãã©ã¡ãŒã¿ãŒãæäŸãããŸãã åã®æé ã§redirect_uriãæå®ããå Žåããã®ã³ãŒã«ãã㯠URL ã䜿çšãããŸãã ãã以å€ã®å Žåã¯ãã¢ããªã®èšå®ããŒãžã®æåã®ã³ãŒã«ãã㯠URL ã䜿çšãããŸããåã®æé ã§
stateãã©ã¡ãŒã¿ãŒãæå®ããå ŽåãGitHub ã«ãstateãã©ã¡ãŒã¿ãŒãå«ãŸããŸããstateãã©ã¡ãŒã¿ãŒãåã®æé ã§éä¿¡ããstateãã©ã¡ãŒã¿ãŒãšäžèŽããªãå ŽåãèŠæ±ãä¿¡é Œã§ããªããããWeb ã¢ããªã±ãŒã·ã§ã³ ãããŒãäžæ¢ããå¿ èŠããããŸãã -
以äžã®ã¯ãšãª ãã©ã¡ãŒã¿ãšå ±ã«ã次㮠URL ã«
POSTèŠæ±ãè¡ãããšã«ãããåã®æé ã®codeããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã«äº€æããŸã:http(s)://HOSTNAME/login/oauth/access_tokenQuery parameter (ã¯ãšãª ãã©ã¡ãŒã¿ãŒ) Type 説æ client_idstringå¿ é ã GitHub App ã®ã¯ã©ã€ã¢ã³ã IDã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ã㪠ID ãšã¯ç°ãªããŸãã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ããªã®èšå®ããŒãžã§ç¢ºèªã§ããŸãã GitHub App ã® [Settings] ããŒãžã«ç§»åããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã client_secretstringå¿ é ã GitHub App ã®ã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ããã ã¢ããªã®èšå®ããŒãžã§ã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ãããçæã§ããŸãã codestringå¿ é ã åã®æé ã§åãåã£ãã³ãŒãã redirect_uristringèªå¯ã®åŸã«ãŠãŒã¶ãéãããã¢ããªã±ãŒã·ã§ã³äžã®URLã ããã¯ãGitHub App ãèšå®ãããšãã« "ã³ãŒã«ãã㯠URL" ãšããŠæå®ãã URL ã®ãããããšå®å šã«äžèŽããå¿ èŠãããã远å ã®ãã©ã¡ãŒã¿ãŒãå«ããããšã¯ã§ããŸããã repository_idstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¢ã¯ã»ã¹ã§ãã 1 ã€ã®ãªããžããªã® IDã GitHub App ãŸãã¯ãŠãŒã¶ãŒããªããžããªã«ã¢ã¯ã»ã¹ã§ããªãå Žåãããã¯ç¡èŠãããŸãã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®ã¢ã¯ã»ã¹ãããã«å¶éããã«ã¯ããã®ãã©ã¡ãŒã¿ãŒã䜿ããŸãã -
GitHub ãããæ¬¡ã®ãã©ã¡ãŒã¿ãŒãå«ãå¿çãæäŸãããŸãã
å¿çãã©ã¡ãŒã¿ãŒ Type 説æ access_tokenstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã ããŒã¯ã³ã¯ ghu_ã§å§ãŸããŸããexpires_inintegeraccess_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«28800(8 æé) ã«ãªããŸããrefresh_tokenstringæŽæ°ããŒã¯ã³ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã ããŒã¯ã³ã¯ ghr_ã§å§ãŸããŸããrefresh_token_expires_inintegerrefresh_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«15897600(6 ãæ) ã«ãªããŸããscopestringããŒã¯ã³ã®ã¹ã³ãŒãã ãã®å€ã¯åžžã«ç©ºã®æååã«ãªããŸãã åŸæ¥ã® OAuth ããŒã¯ã³ãšã¯ç°ãªãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ãã¢ããªãšãŠãŒã¶ãŒã®äž¡æ¹ãæã€ã¢ã¯ã»ã¹èš±å¯ã«å¶éãããŸãã token_typestringããŒã¯ã³ã®çš®é¡ã å€ã¯åžžã« bearerã«ãªããŸãã -
åã®ã¹ãããã®ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿ã£ãŠããŠãŒã¶ãŒã®ä»£ããã« API èŠæ±ãè¡ããŸãã API èŠæ±ã®
AuthorizationããããŒã«ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãå«ããŸãã æ¬¡ã«äŸã瀺ããŸããcurl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
ããã€ã¹ ãããŒã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæãã
Note
ãã®ããã€ã¹ã¯ ããŒã¿ ã«ããã倿Žãããå¯èœæ§ããããŸãã
ã¢ããªããããã¬ã¹ã§ãããããã©ãŠã¶ãŒã«ã¢ã¯ã»ã¹ã§ããªãå Žåã¯ãããã€ã¹ ãããŒã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæããå¿ èŠããããŸãã ããšãã°ãCLI ããŒã«ãã·ã³ãã«ãª Raspberry Pisããã¹ã¯ããã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã€ã¹ ãããŒã䜿ãå¿ èŠããããŸãã ããã€ã¹ ãããŒã䜿çšãããã¥ãŒããªã¢ã«ã«ã€ããŠã¯ããGitHub ã¢ããªã䜿çšã㊠CLI ãæ§ç¯ããããåç §ããŠãã ããã
ããã€ã¹ ãããŒã䜿çšããã«ã¯ããŸãã¢ããªã®èšå®ã§ããã€ã¹ ãããŒãæå¹ã«ããå¿ èŠããããŸãã ããã€ã¹ ãããŒã®æå¹åã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã
ããã€ã¹ ãããŒã§ã¯ãOAuth 2.0 ããã€ã¹èªå¯ä»äžã䜿çšããŸãã
-
POSTèŠæ±ãclient_idã¯ãšãª ãã©ã¡ãŒã¿ãŒãšå ±ã«http(s)://HOSTNAME/login/device/codeã«éä¿¡ããŸãã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ã㪠ID ãšã¯ç°ãªããŸãã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ããªã®èšå®ããŒãžã§ç¢ºèªã§ããŸãã GitHub App ã® [Settings] ããŒãžã«ç§»åããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã -
GitHub ãããæ¬¡ã®ã¯ãšãª ãã©ã¡ãŒã¿ãŒãå«ãå¿çãæäŸãããŸãã
å¿çãã©ã¡ãŒã¿ãŒ Type 説æ device_codestringããã€ã¹ã®æ€èšŒã«äœ¿çšããã確èªã³ãŒãã ãã®ã³ãŒãã®é·ã㯠40 æåã§ãã user_codestringãŠãŒã¶ãŒããã©ãŠã¶ãŒã§ã³ãŒããå ¥åã§ããããã«ãã¢ããªã±ãŒã·ã§ã³ã§è¡šç€ºããå¿ èŠããã確èªã³ãŒãã ãã®ã³ãŒãã¯8æåã§ãéäžã«ãã€ãã³ããããŸãã ããšãã°ãã WDJB-MJHTãã®ããã«å ¥åããŸããverification_uristringãŠãŒã¶ãŒãèªåã® user_codeãå ¥åããå¿ èŠããã URLã URL ã¯http(s)://HOSTNAME/login/deviceã§ããexpires_inintegerdevice_codeãšuser_codeã®æå¹æéãåãããŸã§ã®ç§æ°ã æ¢å®å€ã¯ 900 ç§ (15 å) ã§ããintervalintegerããã€ã¹ã®èªå¯ãå®äºããããã«æ°ããã¢ã¯ã»ã¹ ããŒã¯ã³ã®ãªã¯ãšã¹ã ( POST http(s)://HOSTNAME/login/oauth/access_token) ãçºè¡ããåã«çµéããå¿ èŠãããæå°ç§æ°ã ãã®ééãçµéããåã«èŠæ±ãè¡ããšãã¬ãŒãå¶éã«éããŠslow_downãšã©ãŒãè¿ãããŸãã æ¢å®å€ã¯ 5 ç§ã§ãã -
åã®æé ã®
user_codeãhttp(s)://HOSTNAME/login/deviceã§å ¥åããããã«ãŠãŒã¶ãŒã«æ±ããŸããexpires_inã®æéãçµéããåã«ãŠãŒã¶ãŒãã³ãŒããå ¥åããªããšãã³ãŒãã¯ç¡å¹ã«ãªããŸãã ãããªã£ãå Žåã¯ãããã€ã¹ ãããŒãåèµ·åããå¿ èŠããããŸãã -
ããã€ã¹ããã³ãŠãŒã¶ãŒ ã³ãŒããæéåãã«ãªããããŠãŒã¶ãŒã
user_codeãå ¥åããŠã¢ããªãæ£åžžã«æ¿èªããããŸã§ãclient_idãdevice_codeãgrant_typeã®ã¯ãšãª ãã©ã¡ãŒã¿ãŒ (åŸè¿°) ãšå ±ã«POST http(s)://HOSTNAME/login/oauth/access_tokenãããŒãªã³ã°ããŸããQuery parameter (ã¯ãšãª ãã©ã¡ãŒã¿ãŒ) Type 説æ client_idstringå¿ é ã GitHub App ã®ã¯ã©ã€ã¢ã³ã IDã device_codestringå¿ é ã åã®æé ã§åãåã£ãããã€ã¹ç¢ºèªã³ãŒãã grant_typestringå¿ é ã ä»äžã¿ã€ã㯠urn:ietf:params:oauth:grant-type:device_codeã§ãªããã°ãªããŸãããrepository_idstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¢ã¯ã»ã¹ã§ãã 1 ã€ã®ãªããžããªã® IDã GitHub App ãŸãã¯ãŠãŒã¶ãŒããªããžããªã«ã¢ã¯ã»ã¹ã§ããªãå Žåãããã¯ç¡èŠãããŸãã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®ã¢ã¯ã»ã¹ãããã«å¶éããã«ã¯ããã®ãã©ã¡ãŒã¿ãŒã䜿ããŸãã intervalã§ç€ºãããé »åºŠãããé«ãé »åºŠã§ãã®ãšã³ããã€ã³ããããŒãªã³ã°ããªãã§ãã ããã ãããè¡ããšãã¬ãŒãå¶éã«éããŠslow_downãšã©ãŒãè¿ãããŸããslow_downãšã©ãŒå¿çã«ãã£ãŠãæåŸã®intervalã« 5 ç§ã远å ãããŸãããŠãŒã¶ãŒãã³ãŒããå ¥åãããŸã§ãGitHub 㯠200 ç¶æ ãš
errorå¿çã¯ãšãª ãã©ã¡ãŒã¿ãŒã§å¿çããŸãããšã©ãŒå 説æ authorization_pendingãã®ãšã©ãŒã³ãŒãã¯ãèªå¯ãªã¯ãšã¹ããä¿çäžã§ããŠãŒã¶ããŠãŒã¶ã³ãŒãããŸã å ¥åããŠããªãå Žåã«çããŸãã ã¢ããªã¯ã intervalã§æå®ãããé »åºŠãè¶ ããªãé »åºŠã§POST http(s)://HOSTNAME/login/oauth/access_tokenãããŒãªã³ã°ãç¶ããå¿ èŠããããŸããslow_downslow_downãšã©ãŒãè¿ãããå Žåãæå°ã®intervalããããã¯POST http(s)://HOSTNAME/login/oauth/access_tokenã䜿çšãããªã¯ãšã¹ãéã«å¿ èŠãªæéééã« 5 ç§ã远å ãããŸãã ããšãã°ãéå§æã®ééãšããŠèŠæ±éã«æå°ã§ 5 ç§ãå¿ èŠã ã£ãå Žåã«ãslow_downãšã©ãŒå¿çãè¿ãããå ŽåãããŒã¯ã³ãæ±ããæ°ããèŠæ±ãè¡ããŸã§å°ãªããšã 10 ç§åŸ ããªããã°ãªããªããªããŸãã ãšã©ãŒå¿çã«ã¯ã䜿çšããå¿ èŠãããæ°ããintervalæ å ±ãå«ãŸããŸããexpired_tokenããã€ã¹ ã³ãŒãã®æå¹æéãåããå Žåã¯ã token_expiredãšã©ãŒã衚瀺ãããŸãã ããã€ã¹ã³ãŒããæ±ããæ°ãããªã¯ãšã¹ããçºè¡ããªããã°ãªããŸãããunsupported_grant_typeOAuth ããŒã¯ã³ ãªã¯ãšã¹ãã® POST http(s)://HOSTNAME/login/oauth/access_tokenã§ããŒãªã³ã°ããéã«ã¯ãä»äžã¿ã€ããurn:ietf:params:oauth:grant-type:device_codeãšããŠãå ¥åãã©ã¡ãŒã¿ãŒã«å«ããªããã°ãªããŸãããincorrect_client_credentialsããã€ã¹ãããŒã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãIDãæž¡ããªããã°ãªããŸãããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžã«ãããŸãã ã¯ã©ã€ã¢ã³ã ID ããã¢ã㪠ID ããã³ã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ãããšç°ãªããŸãã incorrect_device_codeæå®ããã device_codeãç¡å¹ã§ããaccess_deniedèªå¯ããã»ã¹äžã«ãŠãŒã¶ãŒããã£ã³ã»ã«ãã¯ãªãã¯ããå Žåã access_deniedãšã©ãŒãè¿ããããŠãŒã¶ãŒã¯ç¢ºèªã³ãŒããåã³å©çšããããšãã§ããªããªããŸããdevice_flow_disabledã¢ããªã±ãŒã·ã§ã³ã®èšå®ã§ãããã€ã¹ ãããŒãæå¹ã«ãªã£ãŠããŸããã ããã€ã¹ ãããŒã®æå¹åã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã -
ãŠãŒã¶ãŒã
user_codeãå ¥åãããšãGitHub ãããæ¬¡ã®ã¯ãšãª ãã©ã¡ãŒã¿ãŒãå«ãå¿çããããŸããå¿çãã©ã¡ãŒã¿ãŒ Type 説æ access_tokenstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã ããŒã¯ã³ã¯ ghu_ã§å§ãŸããŸããexpires_inintegeraccess_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«28800(8 æé) ã«ãªããŸããrefresh_tokenstringæŽæ°ããŒã¯ã³ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã ããŒã¯ã³ã¯ ghr_ã§å§ãŸããŸããrefresh_token_expires_inintegerrefresh_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«15897600(6 ãæ) ã«ãªããŸããscopestringããŒã¯ã³ã®ã¹ã³ãŒãã ãã®å€ã¯åžžã«ç©ºã®æååã«ãªããŸãã åŸæ¥ã® OAuth ããŒã¯ã³ãšã¯ç°ãªãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ãã¢ããªãšãŠãŒã¶ãŒã®äž¡æ¹ãæã€ã¢ã¯ã»ã¹èš±å¯ã«å¶éãããŸãã token_typestringããŒã¯ã³ã®çš®é¡ã å€ã¯åžžã« bearerã«ãªããŸãã -
åã®ã¹ãããã®ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿ã£ãŠããŠãŒã¶ãŒã®ä»£ããã« API èŠæ±ãè¡ããŸãã API èŠæ±ã®
AuthorizationããããŒã«ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãå«ããŸãã æ¬¡ã«äŸã瀺ããŸããcurl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
ãŠãŒã¶ãŒãã¢ããªãã€ã³ã¹ããŒã«ãããšãã«ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæãã
ã¢ããªèšå®ã§ [ã€ã³ã¹ããŒã«æã«ãŠãŒã¶ãŒã®èªå¯ (OAuth) ãèŠæ±ãã] ãéžãã å ŽåãGitHub ã«ããããŠãŒã¶ãŒãã¢ããªãã€ã³ã¹ããŒã«ããçŽåŸã« Web ã¢ããªã±ãŒã·ã§ã³ ãããŒãéå§ãããŸãã
ã¢ããªããŠãŒã¶ãŒ ã¢ã«ãŠã³ããš Organization ã¢ã«ãŠã³ãã®ã©ã¡ãã«ã€ã³ã¹ããŒã«ããããã«é¢ä¿ãªãããã®æ¹æ³ã§ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæã§ããŸãã ãã ããã¢ããªã Organization ã¢ã«ãŠã³ãã«ã€ã³ã¹ããŒã«ãããå Žåã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ ãããŒãŸãã¯ããã€ã¹ ãããŒã䜿çšããŠãOrganization å ã®ä»ã®ãŠãŒã¶ãŒã®ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæããå¿ èŠããããŸãã
-
ãŠãŒã¶ãŒãã¢ããªãã€ã³ã¹ããŒã«ãããšãGitHub ã§ãŠãŒã¶ãŒã¯
http(s)://HOSTNAME/login/oauth/authorize?client_id=CLIENT_IDã«ãªãã€ã¬ã¯ããããŸããããã§ãCLIENT_IDã¯ã¢ããªã®ã¯ã©ã€ã¢ã³ã ID ã§ãã -
ãŠãŒã¶ãŒãèªå¯èŠæ±ãåãå ¥ããå ŽåããŠãŒã¶ãŒã¯ GitHub ã§ã¢ããªèšå®ã®æåã®ã³ãŒã«ãã㯠URL ã«ãªãã€ã¬ã¯ãããã
codeã¯ãšãª ãã©ã¡ãŒã¿ãŒãæäŸãããŸããã©ã®ã³ãŒã«ãã㯠URL ã䜿çšããããå¶åŸ¡ããå Žåã¯ã [ã€ã³ã¹ããŒã«æã«ãŠãŒã¶ãŒã®èªå¯ (OAuth) ãèŠæ±ãã] ãéžã°ãªãã§ãã ããã 代ããã«ãå®å šãª Web ã¢ããªã±ãŒã·ã§ã³ ãããŒã§ãŠãŒã¶ãŒãèªå°ãã
redirect_uriãã©ã¡ãŒã¿ãŒãæå®ããŸãã -
以äžã®ã¯ãšãª ãã©ã¡ãŒã¿ãšå ±ã«ã次㮠URL ã«
POSTèŠæ±ãè¡ãããšã«ãããåã®æé ã®codeããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã«äº€æããŸã:http(s)://HOSTNAME/login/oauth/access_tokenQuery parameter (ã¯ãšãª ãã©ã¡ãŒã¿ãŒ) Type 説æ client_idstringå¿ é ã GitHub App ã®ã¯ã©ã€ã¢ã³ã IDã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ã㪠ID ãšã¯ç°ãªããŸãã ã¯ã©ã€ã¢ã³ã ID ã¯ãã¢ããªã®èšå®ããŒãžã§ç¢ºèªã§ããŸãã GitHub App ã® [Settings] ããŒãžã«ç§»åããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã client_secretstringå¿ é ã GitHub App ã®ã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ããã ã¢ããªã®èšå®ããŒãžã§ã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ãããçæã§ããŸãã codestringå¿ é ã åã®æé ã§åãåã£ãã³ãŒãã redirect_uristringèªå¯ã®åŸã«ãŠãŒã¶ãéãããã¢ããªã±ãŒã·ã§ã³äžã®URLã ããã¯ãGitHub App ãèšå®ãããšãã« "ã³ãŒã«ãã㯠URL" ãšããŠæå®ãã URL ã®ãããããšå®å šã«äžèŽããå¿ èŠãããã远å ã®ãã©ã¡ãŒã¿ãŒãå«ããããšã¯ã§ããŸããã repository_idstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã§ã¢ã¯ã»ã¹ã§ãã 1 ã€ã®ãªããžããªã® IDã GitHub App ãŸãã¯ãŠãŒã¶ãŒããªããžããªã«ã¢ã¯ã»ã¹ã§ããªãå Žåãããã¯ç¡èŠãããŸãã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®ã¢ã¯ã»ã¹ãããã«å¶éããã«ã¯ããã®ãã©ã¡ãŒã¿ãŒã䜿ããŸãã -
GitHub ãããæ¬¡ã®ãã©ã¡ãŒã¿ãŒãå«ãå¿çãæäŸãããŸãã
å¿çãã©ã¡ãŒã¿ãŒ Type 説æ access_tokenstringãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã ããŒã¯ã³ã¯ ghu_ã§å§ãŸããŸããexpires_inintegeraccess_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«28800(8 æé) ã«ãªããŸããrefresh_tokenstringæŽæ°ããŒã¯ã³ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã ããŒã¯ã³ã¯ ghr_ã§å§ãŸããŸããrefresh_token_expires_inintegerrefresh_tokenã®æå¹æéãåãããŸã§ã®ç§æ°ã ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®æå¹æéãç¡å¹ã«ããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯çç¥ãããŸãã å€ã¯åžžã«15897600(6 ãæ) ã«ãªããŸããscopestringããŒã¯ã³ã®ã¹ã³ãŒãã ãã®å€ã¯åžžã«ç©ºã®æååã«ãªããŸãã åŸæ¥ã® OAuth ããŒã¯ã³ãšã¯ç°ãªãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ãã¢ããªãšãŠãŒã¶ãŒã®äž¡æ¹ãæã€ã¢ã¯ã»ã¹èš±å¯ã«å¶éãããŸãã token_typestringããŒã¯ã³ã®çš®é¡ã å€ã¯åžžã« bearerã«ãªããŸãã -
åã®ã¹ãããã®ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿ã£ãŠããŠãŒã¶ãŒã®ä»£ããã« API èŠæ±ãè¡ããŸãã API èŠæ±ã®
AuthorizationããããŒã«ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãå«ããŸãã æ¬¡ã«äŸã瀺ããŸããcurl --request GET \ --url "http(s)://HOSTNAME/api/v3/user" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer USER_ACCESS_TOKEN" \ --header "X-GitHub-Api-Version: 2022-11-28"
æŽæ°ããŒã¯ã³ã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæãã
æ¢å®ã§ã¯ããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ 8 æéåŸã«æéåãã«ãªããŸãã æå¹æéããããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãåãåã£ãå Žåã¯ãæŽæ°ããŒã¯ã³ãåãåããŸãã æŽæ°ããŒã¯ã³ã®æå¹æé㯠6 ãæåŸã§ãã ãã®æŽæ°ããŒã¯ã³ã䜿çšããŠããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãåçæã§ããŸãã 詳ããã¯ãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãæŽæ°ããããã芧ãã ããã
GitHub ã§ã¯ãæå¹æéããããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿çšããããšã匷ããå§ãããŸãã 以åã«æå¹æéããããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®äœ¿çšããªããã¢ãŠããããã®ã®ããã®æ©èœãåã³æå¹åãããå Žåã¯ããGitHub ã¢ããªã®ãªãã·ã§ã³æ©èœã®ã¢ã¯ãã£ãåããåç §ããŠãã ããã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
次ã®ã»ã¯ã·ã§ã³ã§ã¯ããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®çææã«çºçããå¯èœæ§ã®ãããšã©ãŒã®æŠèŠã«ã€ããŠèª¬æããŸãã
äžæ£ãªã¯ã©ã€ã¢ã³ãèªèæ å ±
æå®ãã client_id ãŸã㯠client_secret ãæ£ãããªãå Žåã¯ãincorrect_client_credentials ãšã©ãŒãçºçããŸãã
ãã®ãšã©ãŒã解決ããã«ã¯ãGitHub App ã®æ£ããèªèšŒæ å ±ã䜿ã£ãŠããããšã確èªããŸãã ã¯ã©ã€ã¢ã³ã ID ãšã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ããã¯ãGitHub App ã®èšå®ããŒãžã§ç¢ºèªã§ããŸãã GitHub App ã®èšå®ããŒãžã«ç§»åããæ¹æ³ã®è©³çްã«ã€ããŠã¯ããGitHub App ç»é²ã®å€æŽããåç §ããŠãã ããã
ãªãã€ã¬ã¯ãURIã®äžäžèŽ
GitHub App ã®ç»é²ã«å¯Ÿããã³ãŒã«ãã㯠URL ã®ããããšãäžèŽããªã redirect_uri ãæå®ãããšãredirect_uri_mismatch ãšã©ãŒãçºçããŸãã
ãã®ãšã©ãŒã解決ããã«ã¯ãGitHub App ã®ç»é²ã«å¯Ÿããã³ãŒã«ãã㯠URL ã®ãããããšäžèŽãã redirect_uri ãæå®ãããããã®ãã©ã¡ãŒã¿ãŒãçç¥ããŠãGitHub App ã®ç»é²ã«åèšãããŠããã³ãŒã«ãã㯠URL ã®æåã®ãã®ãæ¢å®ã§äœ¿ããŸãã 詳ããã¯ãããŠãŒã¶ãŒæ¿èªã³ãŒã«ãã㯠URL ã«ã€ããŠããã芧ãã ããã
äžæ£ãªæ€èšŒã³ãŒã
ããã€ã¹ ãããŒã䜿ã£ãŠããŠãæå®ããæ€èšŒã³ãŒã (device_code) ãæ£ãããªãå Žåãæå¹æéåãã®å ŽåããŸã㯠http(s)://HOSTNAME/login/device/code ãžã®æåã®èŠæ±ããåãåã£ãå€ãšäžèŽããªãå Žåã¯ãbad_verification_code ãšã©ãŒãçºçããŸãã
ãã®ãšã©ãŒã解決ããã«ã¯ãããã€ã¹ ãããŒãããäžåºŠéå§ããŠãæ°ããã³ãŒããååŸããå¿ èŠããããŸãã 詳现ã«ã€ããŠã¯ããããã€ã¹ ãããŒã䜿çšããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãçæããããåç §ããŠãã ããã
æŽæ°ããŒã¯ã³ãæ£ãããªã
æå®ããæŽæ°ããŒã¯ã³ãç¡å¹ãŸãã¯æéåãã§ããå Žåã¯ãbad_refresh_token ãšã©ãŒãçºçããŸãã
ãã®ãšã©ãŒã解決ããã«ã¯ãWeb ã¢ããªã±ãŒã·ã§ã³ ãããŒãŸãã¯ããã€ã¹ ãããŒãéå§ãçŽããŠãæ°ãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãšæŽæ°ããŒã¯ã³ãååŸããå¿ èŠããããŸãã æŽæ°ããŒã¯ã³ãåãåãã®ã¯ãGitHub App ãæéåãã®ãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ããªããã€ã³ããŠããå Žåã®ã¿ã§ãã 詳ããã¯ãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãæŽæ°ããããã芧ãã ããã
ãµããŒããããŠããªãä»äžã¿ã€ã
ããã€ã¹ ãããŒãä»ããŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãèŠæ±ããå Žåã¯ãgrant_type ãã©ã¡ãŒã¿ãŒã§ urn:ietf:params:oauth:grant-type:device_code ãæå®ããå¿
èŠããããŸãã æŽæ°ããŒã¯ã³ã䜿ã£ãŠãŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ãæŽæ°ããå Žåã¯ãgrant_type ãã©ã¡ãŒã¿ãŒã§ refresh_token ãæå®ããå¿
èŠããããŸãã æ£ããä»äžã¿ã€ãã䜿ããªããšãunsupported_grant_type ãšã©ãŒãçºçããŸãã
æªç¢ºèªã®ãŠãŒã¶ãŒ ã¡ãŒã«
çæããããšããŠãããŠãŒã¶ãŒ ã¢ã¯ã»ã¹ ããŒã¯ã³ã®å¯Ÿè±¡ãŠãŒã¶ãŒã®ãã©ã€ã㪠ã¡ãŒã« ã¢ãã¬ã¹ããGitHub ã§æ€èšŒãããŠããªãå Žåã¯ãunverified_user_email ãšã©ãŒãçºçããŸãã
ãã®ãšã©ãŒã解決ããã«ã¯ãGitHub ã¢ã«ãŠã³ãã§ãã©ã€ã㪠ã¡ãŒã« ã¢ãã¬ã¹ãæ€èšŒããããããŠãŒã¶ãŒã«æ±ããŸãã 詳现ã«ã€ããŠã¯ãGitHub Free ããã¥ã¡ã³ãã®ãã¡ãŒã«ã¢ãã¬ã¹ãæ€èšŒããããåç §ããŠãã ããã