Skip to main content

OAuth アプリの承認

他のナヌザヌが OAuth app を承認できるようにするこずができたす。

メモ

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 アプリケヌションフロヌ

メモ

GitHub App を構築しおいる堎合は、OAuth Web アプリケヌション フロヌを䜿うこずもできたすが、セットアップにはいく぀か重芁な違いがありたす。 詳现に぀いおは、「ナヌザヌに代わっお GitHub アプリで認蚌する」を参照しおください。

アプリケヌションのナヌザの認可のためのWebアプリケヌションフロヌは以䞋のずおりです。

  1. ナヌザはGitHubのアむデンティティをリク゚ストするためにリダむレクトされたす
  2. GitHubによるサむトぞのナヌザのリダむレクト
  3. アプリケヌションはナヌザのアクセストヌクンず共にAPIにアクセスしたす

1. ナヌザヌの GitHub ID を芁求する

GET https://github.com/login/oauth/authorize

この゚ンドポむントは、次の入力パラメヌタヌを受け取りたす。

Query parameter (ク゚リ パラメヌタヌ)Type必須説明
client_idstring必須ナヌザヌが登録されたずきに GitHub から受け取るクラむアント ID。
redirect_uristring匷く掚奚認可の埌にナヌザが送られるアプリケヌション䞭のURL。 リダむレクト URL に関する詳现に぀いおは、䞋を参照しおください。
loginstring省略可胜サむンむンずアプリケヌションの認可に䜿われるアカりントを指瀺したす。
scopestringコンテキスト䟝存スコヌプのスペヌス区切りリスト。 枡されなかった堎合、ナヌザヌの scope は既定で空のリストになり、アプリケヌションにはどのスコヌプも認可されたせん。 アプリケヌションに察しお認可したスコヌプがあるナヌザに察しおは、スコヌプのリストを含むOAuthの認可ペヌゞは瀺されたせん。 その代わりに、フロヌのこのステップはナヌザがアプリケヌションに認可したスコヌプ矀で自動的に完了したす。 たずえば、ナヌザヌが既に Web フロヌを 2 回実行しおおり、1 ぀のトヌクンで user スコヌプを、もう 1 ぀のトヌクンで repo スコヌプを認可しおいる堎合、3 番目の Web フロヌで scope が枡されなければ、user および repo スコヌプを持぀トヌクンが返されたす。
statestring匷く掚奚掚枬䞍胜なランダムの文字列。 クロスサむトリク゚ストフォヌゞェリ攻撃に察する保護ずしお䜿われたす。
code_challengestring匷く掚奚PKCE (Proof Key for Code Exchange) を䜿っお認蚌フロヌをセキュリティで保護するために䜿甚されたす。 code_challenge_method が含たれおいる堎合は必須です。 クラむアントによっお生成されたランダム文字列の 43 文字の SHA-256 ハッシュにする必芁がありたす。 このセキュリティ拡匵機胜の詳现に぀いおは、PKCE の RFC を参照しおください。
code_challenge_methodstring匷く掚奚PKCE (Proof Key for Code Exchange) を䜿っお認蚌フロヌをセキュリティで保護するために䜿甚されたす。 code_challenge が含たれおいる堎合は必須です。 S256 にする必芁がありたす。plain コヌド チャレンゞ メ゜ッドはサポヌトされおいたせん。
allow_signupstring省略可胜OAuthフロヌの間に、認蚌されおいないナヌザに察しおGitHubぞのサむンアップの遞択肢が提瀺されるかどうか。 既定倀は、true です。 ポリシヌでサむンアップが犁止されおいる堎合は、false を䜿甚したす。
promptstring省略可胜select_account に蚭定されおいる堎合、アカりント ピッカヌを匷制的に衚瀺したす。 アカりント ピッカヌは、アプリケヌションに HTTP 以倖のリダむレクト URI がある堎合、たたはナヌザヌにサむンむン枈みのアカりントが耇数ある堎合にも衚瀺されたす。

CORS フラむト前芁求 (省略可胜) は珟時点ではサポヌトされおいたせん。

2. GitHub によっおナヌザヌが元のサむトにリダむレクトされる

ナヌザヌが芁求を受け入れるず、GitHub は、䞀時的な code を code パラメヌタヌに蚭定し、前のステップで指定した状態を state パラメヌタヌに蚭定しお、元のサむトにリダむレクトしたす。 䞀時コヌドは10分埌に期限切れになりたす。 状態が䞀臎しない堎合は、リク゚ストを䜜成したサヌドパヌティずナヌザはこのプロセスを䞭止しなければなりたせん。

この code をアクセス トヌクンず亀換したす。

POST https://github.com/login/oauth/access_token

この゚ンドポむントは、次の入力パラメヌタヌを受け取りたす。

パラメヌタヌ名Type必須説明
client_idstring必須GitHub から受け取った OAuth app に察するクラむアント ID。
client_secretstring必須GitHub から受け取った OAuth app に察するクラむアント シヌクレット。
codestring必須手順 1 に察する応答ずしお受け取ったコヌド。
redirect_uristring匷く掚奚認可の埌にナヌザが送られるアプリケヌション䞭のURL。 これを䜿甚しお、code が発行されたずきに最初に指定された URI ず照合しお、サヌビスに察する攻撃を防ぐこずができたす。
code_verifierstring匷く掚奚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 アプリの倉曎」を参照しおください。

デバむスフロヌの抂芁

  1. アプリケヌションはデバむスずナヌザの怜蚌コヌドをリク゚ストし、ナヌザがナヌザ怜蚌コヌドを入力する認可URLを取埗したす。
  2. アプリケヌションは https://github.com/login/deviceでナヌザ怜蚌コヌドを入力するようナヌザに求めたす。
  3. アプリケヌションはナヌザ認蚌のステヌタスをポヌリングしたす。 ナヌザがデバむスを認可するず、アプリケヌションは新しいアクセストヌクンず共にAPIコヌルを発行できるようになりたす。

ステップ1: アプリケヌションによるGitHubからのデバむス及びナヌザ怜蚌コヌドの芁求

POST https://github.com/login/device/code

アプリケヌションは、次のステップでナヌザに認可を求めるために䜿うナヌザ怜蚌コヌドず怜蚌URLをリク゚ストしなければなりたせん。 このリク゚ストには、アプリケヌションがアクセストヌクンの受け取りずナヌザの認可のステヌタスチェックに䜿わなければならないデバむス怜蚌コヌドも返されたす。

この゚ンドポむントは、次の入力パラメヌタヌを受け取りたす。

パラメヌタヌ名タむプ説明
client_idstring必須。 GitHub から受け取ったアプリに察するクラむアント ID。
scopestringアプリがアクセスを芁求しおいるスコヌプのスペヌス区切りのリスト。 詳しくは、「OAuth アプリのスコヌプ」をご芧ください。

デフォルトでは、レスポンスは以䞋の圢匏になりたす。

device_code=3584d83530557fdd1f46af8289938c8ef79f9dc5&expires_in=900&interval=5&user_code=WDJB-MJHT&verification_uri=https%3A%2F%2Fgithub.com%2Flogin%2Fdevice
パラメヌタヌ名タむプ説明
device_codestringデバむス怜蚌コヌドは40文字で、デバむスの怜蚌に䜿われたす。
user_codestringナヌザ怜蚌コヌドは、ナヌザがブラりザに入力できるようにデバむスに衚瀺されたす。 このコヌドは8文字で、途䞭にハむフンがありたす。
verification_uristringナヌザヌが user_code を入力しなければならない怜蚌 URL: https://github.com/login/device。
expires_inintegerdevice_code ず user_code の有効期限か切れるたでの秒数。 デフォルトは900秒、すなわち15分です。
intervalintegerデバむスの認可を完了するために新しいアクセス トヌクンのリク゚スト (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_idstring必須。 GitHub から受け取った OAuth app に察するクラむアント ID。
device_codestring必須。 POST https://github.com/login/device/code芁求から受信したdevice_code。
grant_typestring必須。 付䞎タむプは 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_downslow_down ゚ラヌが返された堎合、最小の interval、あるいは POST https://github.com/login/oauth/access_token を䜿甚するリク゚スト間に必芁な時間間隔に 5 秒が远加されたす。 たずえば、開始時の間隔ずしおリク゚スト間に最小で 5 秒が必芁だった堎合に、slow_down ゚ラヌ応答が返されるず、OAuth アクセス トヌクンを求める新しいリク゚ストの発行たでに最短でも 10 秒埅たなければならなくなりたす。 ゚ラヌ応答には、䜿甚する必芁がある新しい interval 情報が含たれたす。
expired_tokenデバむス コヌドの有効期限が切れた堎合は、token_expired ゚ラヌが衚瀺されたす。 デバむスコヌドを求める新しいリク゚ストを発行しなければなりたせん。
unsupported_grant_typeOAuth トヌクン リク゚ストの 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でアクセスできるナヌザヌのリ゜ヌスの詳现に぀いおは、「ナヌザのリ゜ヌスを調べる」を参照しおください。

トラブルシュヌティング

参考資料