ã¡ã¢
OAuth app ã§ã¯ãªã GitHub App ãæ§ç¯ããããšãæ€èšããŠãã ããã
OAuth apps ãš GitHub Apps ã¯ã©ã¡ãã OAuth 2.0 ã䜿ããŸãã
GitHub Apps ã¯ãOAuth app ãšåæ§ã«ããŠãŒã¶ãŒã«ä»£ãã£ãŠåäœããããšããããèªäœã§åäœããããšãã§ããŸããããã¯ãŠãŒã¶ãŒå ¥åãå¿ èŠãšããªãèªååã«åœ¹ç«ã¡ãŸãã ãŸããGitHub Apps ã§ã¯ãã现ããã¢ã¯ã»ã¹èš±å¯ã䜿ããããããã¢ããªã§ã¢ã¯ã»ã¹ã§ãããªããžããªããã现ããå¶åŸ¡ã§ããæå¹æéã®çãããŒã¯ã³ã䜿ãããŸãã 詳现ã«ã€ããŠã¯ããGitHub Apps ãš OAuth ã¢ããªã®éããããã³ãGitHub App ã®äœæã«ã€ããŠããåç §ããŠãã ããã
GitHub ã® OAuth ã®å®è£ ã§ã¯ãæšæºã®èªå¯ã³ãŒãä»äžã¿ã€ããšãWeb ãã©ãŠã¶ãŒã«ã¢ã¯ã»ã¹ã§ããªãã¢ããªã®ããã® OAuth 2.0 Device Authorization Grant ããµããŒããããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ããã¹ãããå Žåã®ããã«ãæšæºçãªæ¹æ³ã§ã®ã¢ããªã±ãŒã·ã§ã³ã®èªå¯ãã¹ãããããå Žåã¯ãé Web ã¢ããªã±ãŒã·ã§ã³ ãããŒãå©çšã§ããŸãã
OAuth appãæ¿èªããã«ã¯ããèªåã®ã¢ããªã«æé©ãªæ¿èªãããŒãæ€èšããŠãã ããã
- Web ã¢ããªã±ãŒã·ã§ã³ ãããŒ: ãã©ãŠã¶ãŒã§å®è¡ãããæšæºç㪠OAuth apps ã®ãŠãŒã¶ãŒãæ¿èªããããã«äœ¿ãããŸãã (æé»çãªèš±å¯ã®çš®é¡ã¯ãµããŒããããŠããŸããã)
- ããã€ã¹ãããŒ: CLI ããŒã«ãªã©ããããã¬ã¹ ã¢ããªã±ãŒã·ã§ã³ã«äœ¿ãããŸãã
Web ã¢ããªã±ãŒã·ã§ã³ãããŒ
ã¡ã¢
GitHub App ãæ§ç¯ããŠããå Žåã¯ãOAuth Web ã¢ããªã±ãŒã·ã§ã³ ãããŒã䜿ãããšãã§ããŸãããã»ããã¢ããã«ã¯ããã€ãéèŠãªéãããããŸãã 詳现ã«ã€ããŠã¯ãããŠãŒã¶ãŒã«ä»£ãã£ãŠ GitHub ã¢ããªã§èªèšŒããããåç §ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ã®èªå¯ã®ããã®Webã¢ããªã±ãŒã·ã§ã³ãããŒã¯ä»¥äžã®ãšããã§ãã
- ãŠãŒã¶ã¯GitHubã®ã¢ã€ãã³ãã£ãã£ããªã¯ãšã¹ãããããã«ãªãã€ã¬ã¯ããããŸã
- GitHubã«ãããµã€ããžã®ãŠãŒã¶ã®ãªãã€ã¬ã¯ã
- ã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ã®ã¢ã¯ã»ã¹ããŒã¯ã³ãšå ±ã«APIã«ã¢ã¯ã»ã¹ããŸã
1. ãŠãŒã¶ãŒã® GitHub ID ãèŠæ±ãã
GET https://github.com/login/oauth/authorize
ãã®ãšã³ããã€ã³ãã¯ã次ã®å ¥åãã©ã¡ãŒã¿ãŒãåãåããŸãã
| Query parameter (ã¯ãšãª ãã©ã¡ãŒã¿ãŒ) | Type | å¿ é | 説æ |
|---|---|---|---|
client_id | string | å¿ é | ãŠãŒã¶ãŒãç»é²ããããšãã« GitHub ããåãåãã¯ã©ã€ã¢ã³ã IDã |
redirect_uri | string | åŒ·ãæšå¥š | èªå¯ã®åŸã«ãŠãŒã¶ãéãããã¢ããªã±ãŒã·ã§ã³äžã®URLã ãªãã€ã¬ã¯ã URL ã«é¢ãã詳现ã«ã€ããŠã¯ãäžãåç §ããŠãã ããã |
login | string | çç¥å¯èœ | ãµã€ã³ã€ã³ãšã¢ããªã±ãŒã·ã§ã³ã®èªå¯ã«äœ¿ãããã¢ã«ãŠã³ããæç€ºããŸãã |
scope | string | ã³ã³ããã¹ãäŸå | ã¹ã³ãŒãã®ã¹ããŒã¹åºåããªã¹ãã æž¡ãããªãã£ãå ŽåããŠãŒã¶ãŒã® scope ã¯æ¢å®ã§ç©ºã®ãªã¹ãã«ãªããã¢ããªã±ãŒã·ã§ã³ã«ã¯ã©ã®ã¹ã³ãŒããèªå¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠèªå¯ããã¹ã³ãŒãããããŠãŒã¶ã«å¯ŸããŠã¯ãã¹ã³ãŒãã®ãªã¹ããå«ãOAuthã®èªå¯ããŒãžã¯ç€ºãããŸããã ãã®ä»£ããã«ããããŒã®ãã®ã¹ãããã¯ãŠãŒã¶ãã¢ããªã±ãŒã·ã§ã³ã«èªå¯ããã¹ã³ãŒã矀ã§èªåçã«å®äºããŸãã ããšãã°ããŠãŒã¶ãŒãæ¢ã« Web ãããŒã 2 åå®è¡ããŠããã1 ã€ã®ããŒã¯ã³ã§ user ã¹ã³ãŒããããã 1 ã€ã®ããŒã¯ã³ã§ repo ã¹ã³ãŒããèªå¯ããŠããå Žåã3 çªç®ã® Web ãããŒã§ scope ãæž¡ãããªããã°ãuser ããã³ repo ã¹ã³ãŒããæã€ããŒã¯ã³ãè¿ãããŸãã |
state | string | åŒ·ãæšå¥š | æšæž¬äžèœãªã©ã³ãã ã®æååã ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªæ»æã«å¯Ÿããä¿è·ãšããŠäœ¿ãããŸãã |
code_challenge | string | åŒ·ãæšå¥š | PKCE (Proof Key for Code Exchange) ã䜿ã£ãŠèªèšŒãããŒãã»ãã¥ãªãã£ã§ä¿è·ããããã«äœ¿çšãããŸãã code_challenge_method ãå«ãŸããŠããå Žåã¯å¿
é ã§ãã ã¯ã©ã€ã¢ã³ãã«ãã£ãŠçæãããã©ã³ãã æååã® 43 æåã® SHA-256 ããã·ã¥ã«ããå¿
èŠããããŸãã ãã®ã»ãã¥ãªãã£æ¡åŒµæ©èœã®è©³çްã«ã€ããŠã¯ãPKCE ã® RFC ãåç
§ããŠãã ããã |
code_challenge_method | string | åŒ·ãæšå¥š | PKCE (Proof Key for Code Exchange) ã䜿ã£ãŠèªèšŒãããŒãã»ãã¥ãªãã£ã§ä¿è·ããããã«äœ¿çšãããŸãã code_challenge ãå«ãŸããŠããå Žåã¯å¿
é ã§ãã S256 ã«ããå¿
èŠããããŸããplain ã³ãŒã ãã£ã¬ã³ãž ã¡ãœããã¯ãµããŒããããŠããŸããã |
allow_signup | string | çç¥å¯èœ | OAuthãããŒã®éã«ãèªèšŒãããŠããªããŠãŒã¶ã«å¯ŸããŠGitHubãžã®ãµã€ã³ã¢ããã®éžæè¢ãæç€ºããããã©ããã æ¢å®å€ã¯ãtrue ã§ãã ããªã·ãŒã§ãµã€ã³ã¢ãããçŠæ¢ãããŠããå Žåã¯ãfalse ã䜿çšããŸãã |
prompt | string | çç¥å¯èœ | select_account ã«èšå®ãããŠããå Žåãã¢ã«ãŠã³ã ããã«ãŒã匷å¶çã«è¡šç€ºããŸãã ã¢ã«ãŠã³ã ããã«ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã« HTTP 以å€ã®ãªãã€ã¬ã¯ã URI ãããå ŽåããŸãã¯ãŠãŒã¶ãŒã«ãµã€ã³ã€ã³æžã¿ã®ã¢ã«ãŠã³ããè€æ°ããå Žåã«ã衚瀺ãããŸãã |
CORS ãã©ã€ãåèŠæ± (çç¥å¯èœ) ã¯çŸæç¹ã§ã¯ãµããŒããããŠããŸããã
2. GitHub ã«ãã£ãŠãŠãŒã¶ãŒãå ã®ãµã€ãã«ãªãã€ã¬ã¯ãããã
ãŠãŒã¶ãŒãèŠæ±ãåãå
¥ãããšãGitHub ã¯ãäžæç㪠code ã code ãã©ã¡ãŒã¿ãŒã«èšå®ããåã®ã¹ãããã§æå®ããç¶æ
ã state ãã©ã¡ãŒã¿ãŒã«èšå®ããŠãå
ã®ãµã€ãã«ãªãã€ã¬ã¯ãããŸãã äžæã³ãŒãã¯10ååŸã«æéåãã«ãªããŸãã ç¶æ
ãäžèŽããªãå Žåã¯ããªã¯ãšã¹ããäœæãããµãŒãããŒãã£ãšãŠãŒã¶ã¯ãã®ããã»ã¹ãäžæ¢ããªããã°ãªããŸããã
ãã® code ãã¢ã¯ã»ã¹ ããŒã¯ã³ãšäº€æããŸãã
POST https://github.com/login/oauth/access_token
ãã®ãšã³ããã€ã³ãã¯ã次ã®å ¥åãã©ã¡ãŒã¿ãŒãåãåããŸãã
| ãã©ã¡ãŒã¿ãŒå | Type | å¿ é | 説æ |
|---|---|---|---|
client_id | string | å¿ é | GitHub ããåãåã£ã OAuth app ã«å¯Ÿããã¯ã©ã€ã¢ã³ã IDã |
client_secret | string | å¿ é | GitHub ããåãåã£ã OAuth app ã«å¯Ÿããã¯ã©ã€ã¢ã³ã ã·ãŒã¯ã¬ããã |
code | string | å¿ é | æé 1 ã«å¯Ÿããå¿çãšããŠåãåã£ãã³ãŒãã |
redirect_uri | string | åŒ·ãæšå¥š | èªå¯ã®åŸã«ãŠãŒã¶ãéãããã¢ããªã±ãŒã·ã§ã³äžã®URLã ããã䜿çšããŠãcode ãçºè¡ããããšãã«æåã«æå®ããã URI ãšç
§åããŠããµãŒãã¹ã«å¯Ÿããæ»æãé²ãããšãã§ããŸãã |
code_verifier | string | åŒ·ãæšå¥š | PKCE (Proof Key for Code Exchange) ã䜿ã£ãŠèªèšŒãããŒãã»ãã¥ãªãã£ã§ä¿è·ããããã«äœ¿çšãããŸãã ãŠãŒã¶ãŒèªå¯äžã« code_challenge ãéä¿¡ãããå Žåã«å¿
èŠã§ãã èªå¯èŠæ±å
ã® code_challenge ãçæããããã«äœ¿ã£ãå
ã®å€ã«ããå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã«å¿ããŠãstate ãã©ã¡ãŒã¿ãŒãšå
±ã« Cookie ã«æ ŒçŽããããèªèšŒäžã«ã»ãã·ã§ã³å€æ°ã«æ ŒçŽããããšãã§ããŸãã |
ããã©ã«ãã§ã¯ãã¬ã¹ãã³ã¹ã¯ä»¥äžã®åœ¢åŒã«ãªããŸãã
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer
Accept ããããŒã«åœ¢åŒãæå®ããå Žåã¯ãå¥ã®åœ¢åŒã§å¿çãåãåãããšãã§ããŸãã ããšãã°ãAccept: application/json ãŸã㯠Accept: application/xml ã§ãã
Accept: application/json
{
"access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a",
"scope":"repo,gist",
"token_type":"bearer"
}
Accept: application/xml
<OAuth>
<token_type>bearer</token_type>
<scope>repo,gist</scope>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
</OAuth>
3. ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿ã£ãŠ API ã«ã¢ã¯ã»ã¹ãã
ãã®ã¢ã¯ã»ã¹ããŒã¯ã³ã䜿ãã°ããŠãŒã¶ã®ä»£ããã«APIãžã®ãªã¯ãšã¹ããçºè¡ã§ããŸãã
Authorization: Bearer OAUTH-TOKEN
GET https://api.github.com/user
ããšãã°ãcurlã§ã¯ä»¥äžã®ããã«Authorizationããããèšå®ã§ããŸãã
curl -H "Authorization: Bearer OAUTH-TOKEN" https://api.github.com/user
ã¢ã¯ã»ã¹ ããŒã¯ã³ãåä¿¡ãããã³ã«ãããŒã¯ã³ã䜿çšããŠãŠãŒã¶ãŒ ID ãåæ€èšŒããå¿ èŠããããŸãã ã¢ããªãæ¿èªããããã«éä¿¡ãããšãã«ãŠãŒã¶ãŒã¯ãµã€ã³ã€ã³ããŠããã¢ã«ãŠã³ãã倿Žã§ããŸãããµã€ã³ã€ã³ãããã³ã«ãŠãŒã¶ãŒ ID ãæ€èšŒããªããšããŠãŒã¶ãŒ ããŒã¿ãæ··åšãããªã¹ã¯ããããŸãã
ããã€ã¹ãããŒ
ããã€ã¹ãããŒã䜿ãã°ãCLIããŒã«ãGitè³æ Œæ å ±ãããŒãžã£ãŒãªã©ã®ãããã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãèªå¯ã§ããŸãã
ããã€ã¹ ãããŒã䜿çšããŠãŠãŒã¶ãŒãèªå¯ããã³ç¹å®ããã«ã¯ããŸãã¢ããªã±ãŒã·ã§ã³ã®èšå®ã§ããã€ã¹ ãããŒãæå¹ã«ããå¿ èŠããããŸãã ã¢ããªã§ããã€ã¹ ãããŒãæå¹ã«ããæ¹æ³ã«ã€ããŠã¯ãGitHub Apps ã®å Žåã¯ãGitHub App ç»é²ã®å€æŽããOAuth apps ã®å Žåã¯ãOAuth ã¢ããªã®å€æŽããåç §ããŠãã ããã
ããã€ã¹ãããŒã®æŠèŠ
- ã¢ããªã±ãŒã·ã§ã³ã¯ããã€ã¹ãšãŠãŒã¶ã®æ€èšŒã³ãŒãããªã¯ãšã¹ããããŠãŒã¶ããŠãŒã¶æ€èšŒã³ãŒããå ¥åããèªå¯URLãååŸããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã¯
https://github.com/login/deviceã§ãŠãŒã¶æ€èšŒã³ãŒããå ¥åãããããŠãŒã¶ã«æ±ããŸãã - ã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶èªèšŒã®ã¹ããŒã¿ã¹ãããŒãªã³ã°ããŸãã ãŠãŒã¶ãããã€ã¹ãèªå¯ãããšãã¢ããªã±ãŒã·ã§ã³ã¯æ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãšå ±ã«APIã³ãŒã«ãçºè¡ã§ããããã«ãªããŸãã
ã¹ããã1: ã¢ããªã±ãŒã·ã§ã³ã«ããGitHubããã®ããã€ã¹åã³ãŠãŒã¶æ€èšŒã³ãŒãã®èŠæ±
POST https://github.com/login/device/code
ã¢ããªã±ãŒã·ã§ã³ã¯ã次ã®ã¹ãããã§ãŠãŒã¶ã«èªå¯ãæ±ããããã«äœ¿ããŠãŒã¶æ€èšŒã³ãŒããšæ€èšŒURLããªã¯ãšã¹ãããªããã°ãªããŸããã ãã®ãªã¯ãšã¹ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¢ã¯ã»ã¹ããŒã¯ã³ã®åãåããšãŠãŒã¶ã®èªå¯ã®ã¹ããŒã¿ã¹ãã§ãã¯ã«äœ¿ããªããã°ãªããªãããã€ã¹æ€èšŒã³ãŒããè¿ãããŸãã
ãã®ãšã³ããã€ã³ãã¯ã次ã®å ¥åãã©ã¡ãŒã¿ãŒãåãåããŸãã
| ãã©ã¡ãŒã¿ãŒå | ã¿ã€ã | 説æ |
|---|---|---|
client_id | string | å¿ é ã GitHub ããåãåã£ãã¢ããªã«å¯Ÿããã¯ã©ã€ã¢ã³ã IDã |
scope | string | ã¢ããªãã¢ã¯ã»ã¹ãèŠæ±ããŠããã¹ã³ãŒãã®ã¹ããŒã¹åºåãã®ãªã¹ãã 詳ããã¯ããOAuth ã¢ããªã®ã¹ã³ãŒãããã芧ãã ããã |
ããã©ã«ãã§ã¯ãã¬ã¹ãã³ã¹ã¯ä»¥äžã®åœ¢åŒã«ãªããŸãã
device_code=3584d83530557fdd1f46af8289938c8ef79f9dc5&expires_in=900&interval=5&user_code=WDJB-MJHT&verification_uri=https%3A%2F%2Fgithub.com%2Flogin%2Fdevice
| ãã©ã¡ãŒã¿ãŒå | ã¿ã€ã | 説æ |
|---|---|---|
device_code | string | ããã€ã¹æ€èšŒã³ãŒãã¯40æåã§ãããã€ã¹ã®æ€èšŒã«äœ¿ãããŸãã |
user_code | string | ãŠãŒã¶æ€èšŒã³ãŒãã¯ããŠãŒã¶ããã©ãŠã¶ã«å ¥åã§ããããã«ããã€ã¹ã«è¡šç€ºãããŸãã ãã®ã³ãŒãã¯8æåã§ãéäžã«ãã€ãã³ããããŸãã |
verification_uri | string | ãŠãŒã¶ãŒã user_code ãå
¥åããªããã°ãªããªãæ€èšŒ URL: https://github.com/login/deviceã |
expires_in | integer | device_code ãš user_code ã®æå¹æéãåãããŸã§ã®ç§æ°ã ããã©ã«ãã¯900ç§ãããªãã¡15åã§ãã |
interval | integer | ããã€ã¹ã®èªå¯ãå®äºããããã«æ°ããã¢ã¯ã»ã¹ ããŒã¯ã³ã®ãªã¯ãšã¹ã (POST https://github.com/login/oauth/access_token) ãçºè¡ããåã«çµéããå¿
èŠãããæå°ç§æ°ã ããšãã°intervalã5ã§ããã°ã5ç§ãçµéãããŸã§ã¯æ°ãããªã¯ãšã¹ããçºè¡ã§ããŸããã 5 ç§éã«è€æ°ã®ãªã¯ãšã¹ããçºè¡ãããšãã¬ãŒãå¶éã«éã㊠slow_down ãšã©ãŒãè¿ãããŸãã |
Accept ããããŒã«åœ¢åŒãæå®ããå Žåã¯ãå¥ã®åœ¢åŒã§å¿çãåãåãããšãã§ããŸãã ããšãã°ãAccept: application/json ãŸã㯠Accept: application/xml ã§ãã
Accept: application/json
{
"device_code": "3584d83530557fdd1f46af8289938c8ef79f9dc5",
"user_code": "WDJB-MJHT",
"verification_uri": "https://github.com/login/device",
"expires_in": 900,
"interval": 5
}
Accept: application/xml
<OAuth>
<device_code>3584d83530557fdd1f46af8289938c8ef79f9dc5</device_code>
<user_code>WDJB-MJHT</user_code>
<verification_uri>https://github.com/login/device</verification_uri>
<expires_in>900</expires_in>
<interval>5</interval>
</OAuth>
ã¹ããã2: ãã©ãŠã¶ã§ãŠãŒã¶ã³ãŒãã®å ¥åããŠãŒã¶ã«ä¿ã
ããã€ã¹ã¯ãŠãŒã¶æ€èšŒã³ãŒãã衚瀺ãããŠãŒã¶ã«å¯ŸããŠãã®ã³ãŒãã https://github.com/login/deviceã§å
¥åããããã«æ±ããŸãã
ã¹ããã3: ãŠãŒã¶ãããã€ã¹ãèªèšŒããããã¢ããªã±ãŒã·ã§ã³ãGitHubãããŒãªã³ã°
POST https://github.com/login/oauth/access_token
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã€ã¹ããã³ãŠãŒã¶ãŒ ã³ãŒããæéåãã«ãªãããæå¹ãªãŠãŒã¶ãŒ ã³ãŒãã§ã¢ããªã±ãŒã·ã§ã³ãèªå¯ããããŸã§ãPOST https://github.com/login/oauth/access_token ãããŒãªã³ã°ããããã€ã¹èªå¯ãªã¯ãšã¹ããçºè¡ããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¬ãŒãå¶éãšã©ãŒãé¿ããããã«ãã¹ããã 1 ã§ååŸããããŒãªã³ã°ã®æå° interval ã䜿ããŸãã 詳现ã«ã€ããŠã¯ããããã€ã¹ ãããŒã®ã¬ãŒãå¶éããåç
§ããŠãã ããã
ãŠãŒã¶ã¯ã15åïŒãããã¯900ç§ïŒä»¥å
ã«æå¹ãªã³ãŒããå
¥åããªããã°ãªããŸããã 15 åãçµéãããšãæ°ããªããã€ã¹èªå¯ã³ãŒãã POST https://github.com/login/device/code ã§ãªã¯ãšã¹ãããªããã°ãªããŸããã
ãŠãŒã¶ãèªå¯ããããšãã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ã®ä»£ããã«APIã«ãªã¯ãšã¹ããçºè¡ããããã«å©çšã§ããã¢ã¯ã»ã¹ããŒã¯ã³ãåãåããŸãã
ãã®ãšã³ããã€ã³ãã¯ã次ã®å ¥åãã©ã¡ãŒã¿ãŒãåãåããŸãã
| ãã©ã¡ãŒã¿ãŒå | ã¿ã€ã | 説æ |
|---|---|---|
client_id | string | å¿ é ã GitHub ããåãåã£ã OAuth app ã«å¯Ÿããã¯ã©ã€ã¢ã³ã IDã |
device_code | string | å¿
é ã POST https://github.com/login/device/codeèŠæ±ããåä¿¡ããdevice_codeã |
grant_type | string | å¿
é ã ä»äžã¿ã€ã㯠urn:ietf:params:oauth:grant-type:device_code ã§ãªããã°ãªããŸããã |
ããã©ã«ãã§ã¯ãã¬ã¹ãã³ã¹ã¯ä»¥äžã®åœ¢åŒã«ãªããŸãã
access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer&scope=repo%2Cgist
Accept ããããŒã«åœ¢åŒãæå®ããå Žåã¯ãå¥ã®åœ¢åŒã§å¿çãåãåãããšãã§ããŸãã ããšãã°ãAccept: application/json ãŸã㯠Accept: application/xml ã§ãã
Accept: application/json
{
"access_token": "gho_16C7e42F292c6912E7710c838347Ae178B4a",
"token_type": "bearer",
"scope": "repo,gist"
}
Accept: application/xml
<OAuth>
<access_token>gho_16C7e42F292c6912E7710c838347Ae178B4a</access_token>
<token_type>bearer</token_type>
<scope>gist,repo</scope>
</OAuth>
ããã€ã¹ãããŒã®ã¬ãŒãå¶é
ãŠãŒã¶ããã©ãŠã¶äžã§æ€èšŒã³ãŒãããµããããããå Žåãã¢ããªã±ãŒã·ã§ã³ããšã«1æéã«50åã®ãµãããããšããã¬ãŒãå¶éããããŸãã
ãªã¯ãšã¹ãéã§èŠæ±ãããæå°ã®æééé (ã€ãŸã interval) å
ã§è€æ°ã®ã¢ã¯ã»ã¹ ããŒã¯ã³ ãªã¯ãšã¹ã (POST https://github.com/login/oauth/access_token) ãçºè¡ãããšãã¬ãŒãå¶éã«éããslow_down ãšã©ãŒå¿çãè¿ãããŸãã slow_down ãšã©ãŒå¿çã«ãã£ãŠãæåŸã® interval ã« 5 ç§ã远å ãããŸãã 詳现ã«ã€ããŠã¯ããããã€ã¹ ãããŒã®ãšã©ãŒ ã³ãŒãããåç
§ããŠãã ããã
ããã€ã¹ãããŒã®ãšã©ãŒã³ãŒã
| ãšã©ãŒ ã³ãŒã | 説æ |
|---|---|
authorization_pending | ãã®ãšã©ãŒã³ãŒãã¯ãèªå¯ãªã¯ãšã¹ããä¿çäžã§ããŠãŒã¶ããŠãŒã¶ã³ãŒãããŸã å
¥åããŠããªãå Žåã«çããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãinterval ãè¶
ããªãç¯å²ã§ POST https://github.com/login/oauth/access_token ãªã¯ãšã¹ããããŒãªã³ã°ãç¶ããããšãæåŸ
ãããŸãããã®éã«ã¯ããªã¯ãšã¹ãéã«æå°ã®ç§æ°ã空ããããšãå¿
èŠã§ãã |
slow_down | slow_down ãšã©ãŒãè¿ãããå Žåãæå°ã® intervalãããã㯠POST https://github.com/login/oauth/access_token ã䜿çšãããªã¯ãšã¹ãéã«å¿
èŠãªæéééã« 5 ç§ã远å ãããŸãã ããšãã°ãéå§æã®ééãšããŠãªã¯ãšã¹ãéã«æå°ã§ 5 ç§ãå¿
èŠã ã£ãå Žåã«ãslow_down ãšã©ãŒå¿çãè¿ããããšãOAuth ã¢ã¯ã»ã¹ ããŒã¯ã³ãæ±ããæ°ãããªã¯ãšã¹ãã®çºè¡ãŸã§ã«æçã§ã 10 ç§åŸ
ããªããã°ãªããªããªããŸãã ãšã©ãŒå¿çã«ã¯ã䜿çšããå¿
èŠãããæ°ãã interval æ
å ±ãå«ãŸããŸãã |
expired_token | ããã€ã¹ ã³ãŒãã®æå¹æéãåããå Žåã¯ãtoken_expired ãšã©ãŒã衚瀺ãããŸãã ããã€ã¹ã³ãŒããæ±ããæ°ãããªã¯ãšã¹ããçºè¡ããªããã°ãªããŸããã |
unsupported_grant_type | OAuth ããŒã¯ã³ ãªã¯ãšã¹ãã® POST https://github.com/login/oauth/access_token ã§ããŒãªã³ã°ããéã«ã¯ãä»äžã¿ã€ãã urn:ietf:params:oauth:grant-type:device_code ãšããŠãå
¥åãã©ã¡ãŒã¿ãŒã«å«ããªããã°ãªããŸããã |
incorrect_client_credentials | ããã€ã¹ãããŒã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãIDãæž¡ããªããã°ãªããŸãããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžã«ãããŸãã ããã€ã¹ ãããŒã« client_secret ã¯å¿
èŠãããŸããã |
incorrect_device_code | æž¡ãããdevice_codeãæå¹ã§ã¯ãããŸããã |
access_denied | èªå¯ããã»ã¹äžã«ãŠãŒã¶ãŒããã£ã³ã»ã«ãã¯ãªãã¯ããå Žåãaccess_denied ãšã©ãŒãè¿ããããŠãŒã¶ãŒã¯æ€èšŒã³ãŒããå床å©çšããããšãã§ããªããªããŸãã |
device_flow_disabled | ã¢ããªã±ãŒã·ã§ã³ã®èšå®ã§ãããã€ã¹ ãããŒãæå¹ã«ãªã£ãŠããŸããã 詳现ã«ã€ããŠã¯ããããã€ã¹ ãããŒããåç §ããŠãã ããã |
詳现ã«ã€ããŠã¯ããOAuth 2.0 Device Authorization Grantã(OAuth 2.0 ããã€ã¹èªå¯ã®ä»äž) ãåç §ããŠãã ããã
éWebã¢ããªã±ãŒã·ã§ã³ãããŒ
ãã¹ãã®ãããªéå®çãªç¶æ³ã§ã¯ãéWebèªèšŒãå©çšã§ããŸãã å¿ èŠãªå Žåã¯ãpersonal access token ã®èšå®ããŒãžã䜿ããåºæ¬èªèšŒã䜿ã£ãŠ personal access token ãäœæã§ããŸãã ãã®ææ³ã䜿ãã°ããŠãŒã¶ã¯ãã€ã§ãã¢ã¯ã»ã¹ãåãæ¶ããŸãã
ãªãã€ã¬ã¯ã URI
redirect_uri ãã©ã¡ãŒã¿ãŒã¯çç¥å¯èœã§ãã çç¥ããå ŽåãGitHub ã«ãããŠãŒã¶ãŒã¯ OAuth appã®èšå®ã«æ§æãããŠããã³ãŒã«ãã㯠URL ã«ãªãã€ã¬ã¯ããããŸãã æå®ããå Žåããªãã€ã¬ã¯ã URL ã®ãã¹ã (ãµããã¡ã€ã³ãé€ã) ãšããŒãã¯ãã³ãŒã«ãã㯠URL ãšå®å
šã«äžèŽããŠããå¿
èŠããããŸãã ãªãã€ã¬ã¯ã URL ã®ãã¹ã¯ãã³ãŒã«ãã㯠URL ã®ãµããã£ã¬ã¯ããªãåç
§ããŠããªããã°ãªããŸããã
CALLBACK: http://example.com/path
GOOD: http://example.com/path
GOOD: http://example.com/path/subdir/other
GOOD: http://oauth.example.com/path
GOOD: http://oauth.example.com/path/subdir/other
BAD: http://example.com/bar
BAD: http://example.com/
BAD: http://example.com:8080/path
BAD: http://oauth.example.com:8080/path
BAD: http://example.org
ã«ãŒããã㯠ãªãã€ã¬ã¯ã URI
ãªãã·ã§ã³redirect_uriãã©ã¡ãŒã¿ãŒã¯ããã¹ã¯ããã ã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŠãããã€ãã£ã ã¢ããªã±ãŒã·ã§ã³ã«äŸ¿å©ãªLoopback URL ã«ã䜿çšã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã«ãŒããã㯠URL ãšããŒããæå®ããå Žåãã¢ããªã±ãŒã·ã§ã³ãèªå¯ããåŸããŠãŒã¶ãŒã¯æå®ãã URL ãšããŒãã«ãªãã€ã¬ã¯ããããŸãã redirect_uri ã¯ãã¢ããªã®ã³ãŒã«ãã㯠URL ã§æå®ãããããŒããšäžèŽããŠããå¿
èŠã¯ãããŸããã
http://127.0.0.1/pathã³ãŒã«ãã㯠URL ã«ã€ããŠã¯ãã¢ããªã±ãŒã·ã§ã³ãããŒã1234ã§ãªãã¹ã³ããŠããå Žåã«ãã®redirect_uriã䜿çšã§ããŸãã
http://127.0.0.1:1234/path
OAuth ã® RFC ã§ã¯ãlocalhost ã®äœ¿çšã¯æšå¥šãããŠãããã代ããã«ã«ãŒããã㯠ãªãã©ã« 127.0.0.1 ãŸã㯠IPv6 ::1 ã䜿ãããšãæšå¥šãããŠããŸãã
OAuth apps ã®è€æ°ã®ããŒã¯ã³ãäœæãã
ãŠãŒã¶ïŒã¢ããªã±ãŒã·ã§ã³ïŒã¹ã³ãŒãã®çµã¿åããã«å¯ŸããŠè€æ°ã®ããŒã¯ã³ãäœæããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ã§ããŸãã
ããã¯ãã䜿ãã® OAuth appãããµã€ã³ã€ã³ã« GitHub ãå©çšããåºæ¬çãªãŠãŒã¶ãŒæ å ±ããå¿ èŠãšããªã 1 ã€ã®ã¯ãŒã¯ãããŒããµããŒãããŠããå Žåã«äŸ¿å©ã§ãã å¥ã®ã¯ãŒã¯ãããŒã¯ãŠãŒã¶ã®ãã©ã€ããŒããªããžããªãžã®ã¢ã¯ã»ã¹ãå¿ èŠãšããŠããŠãããŸããŸããã è€æ°ã®ããŒã¯ã³ã䜿ããšãOAuth appã¯ããããã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿã㊠Web ãããŒãå®è¡ã§ããå¿ èŠãªã¹ã³ãŒãã ãããªã¯ãšã¹ãããŸãã ãŠãŒã¶ãŒããµã€ã³ã€ã³ã«ã¢ããªã±ãŒã·ã§ã³ã ãã䜿ãå Žåã¯ãOAuth appã«ãã©ã€ããŒã ãªããžããªãžã®ã¢ã¯ã»ã¹ãä»äžããå¿ èŠã¯ãããŸããã
ãŠãŒã¶ãŒ/ã¢ããªã±ãŒã·ã§ã³/ã¹ã³ãŒãã®çµã¿åããããšã«ã1 æéãããäœæãããããŒã¯ã³æ°ã«ã¯ 10 ãšããäžéããããŸãã ã¢ããªã±ãŒã·ã§ã³ã§åããŠãŒã¶ãŒãšåãã¹ã³ãŒãã«å¯Ÿã㊠10 åãè¶ ããããŒã¯ã³ãäœæãããå ŽåãåããŠãŒã¶ãŒ/ã¢ããªã±ãŒã·ã§ã³/ã¹ã³ãŒãã®çµã¿åãããæã€æãå€ãããŒã¯ã³ãåãæ¶ãããŸãã ãã ããæéåäœã®ã¬ãŒãå¶éã«éããŠããæãå€ãããŒã¯ã³ã¯åãæ¶ãããŸããã 代ããã«ããã©ãŠã¶ãŒå ã§åæ¿èªããã³ãããããªã¬ãŒããããŠãŒã¶ãŒã¯ã¢ããªã«ä»äžããŠããã¢ã¯ã»ã¹èš±å¯ãå確èªããããæ±ããããŸãã ãã®ããã³ããã¯ãã¢ããªã 1 æé以å ã«ãŠãŒã¶ãŒã« 10 åã®ããŒã¯ã³ãèŠæ±ããçç±ãã»ãšãã©ãªããããã¢ããªãé¥ã£ãŠããå¯èœæ§ã®ããç¡éã«ãŒããäžæãããããšãç®çãšããŠããŸãã
èŠå
OAuth app ãããã¹ãŠã®ã¢ã¯ã»ã¹èš±å¯ãåãæ¶ããšããŠãŒã¶ãŒã®ä»£ããã«ã¢ããªã±ãŒã·ã§ã³ã§çæããããã¹ãŠã® SSH ã㌠(é 眮ããŒãå«ã) ãåé€ãããŸãã
ãŠãŒã¶ã«ã¢ã¯ã»ã¹ãã¬ãã¥ãŒããŠããã
OAuth appãžã®æ¿èªæ å ±ãžãªã³ã¯ãããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã®æ¿èªã確èªããããåãæ¶ãããããããšãã§ããŸãã
ãã®ãªã³ã¯ãæ§ç¯ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãç»é²ãããšãã« GitHub ããåãåã£ã OAuth appã® client_id ãå¿
èŠã«ãªããŸãã
https://github.com/settings/connections/applications/:client_id
ãã³ã
OAuth appã§ã¢ã¯ã»ã¹ã§ãããŠãŒã¶ãŒã®ãªãœãŒã¹ã®è©³çްã«ã€ããŠã¯ãããŠãŒã¶ã®ãªãœãŒã¹ã調ã¹ãããåç §ããŠãã ããã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
- èªå¯ãªã¯ãšã¹ããšã©ãŒã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
- OAuth ã¢ã㪠ã¢ã¯ã»ã¹ ããŒã¯ã³ã®ãªã¯ãšã¹ã ãšã©ãŒã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
- ããã€ã¹ ãã㌠ãšã©ãŒ
- ããŒã¯ã³ã®æå¹æéãšåãæ¶ã