kakudooo docs

GitHub Appの認証方法について調べてみた

GitHub Appには、アプリからGitHub APIを介して対象のリソースにアクセスするために、以下の3つの認証が用意されている。

GitHub App 自体として認証

if you want to use the API to generate an installation access token for accessing organization resources, list installations across accounts for your app, or suspend an app installation, you must authenticate as an app.

参照: Authenticating as a GitHub App

を行うために必要な認証であり、GitHub App自体の認証のことを指す。 具体的にはGitHub AppのIDをpayloadに組み込み、private key で署名したJWTを生成して認証に使用する。

JWTの生成方法については、Generating a JSON Web Token (JWT) for a GitHub Appを参照。

インストール単位での認証

You can make your GitHub App authenticate as an installation in order to make API requests that affect resources owned by the account where the app is installed.

参照: Authenticating as a GitHub App installation

GitHub Appがインストールされたアカウントが所有するリソース(repositoryなど)に対して、それらを操作するAPIリクエストを行うために必要な認証。

インストール単位での認証を行うために、API経由でinstallation access tokenを発行する。この時「GitHub App 自体として認証」で作成したJWTをAuthorizationヘッダーにセットしてリクエストを行う必要がある。

GitHub REST APIやGraphQL APIをリクエストする際Authorizationヘッダーに取得したinstallation access tokenをセットする。

詳しくは、Authenticating as a GitHub App installation を参照。

ユーザー単位での認証

Your GitHub App can perform actions on behalf of a user, like creating an issue, posting a comment, or creating a deployment.

参照: Authenticating with a GitHub App on behalf of a user

GitHub Appがユーザーとして振る舞うために必要な認証。

ユースケースの例

個別のユーザーとしてGitHub AppからAPIリクエストを行うため、ユーザーがアプリをインストールした際、ユーザー自身にアプリが対象リソースへアクセスすることを許可してもらう必要がある。(認可フロー)

また、取得したuser access tokenには、ユーザーとアプリ両方に付与されている権限のみが付与される。

ユーザー単位で認証を行う場合は、以下のいずれかのフローでuser access tokenを発行する。

GitHub REST APIやGraphQL APIをリクエストする際Authorizationヘッダーに取得したuser access tokenをセットする。

詳しくは、Generating a user access token for a GitHub Appを参照

認証フローとして

認証の主体によって

の3種類に分けられているが、「インストール単位での認証」は「GitHub App自体の認証」前提としている。また、「ユーザー単位での認証フロー」についてはOAuth認証を前提とするため、「GitHub App自体の認証」を必要としない。

そのため、「GitHub AppからGitHub上のリソースを操作するための認証フロー」としては、以下の2通りで理解しておくとよい。

  1. インストール単位での認証フロー (GitHub App自体の認証 + インストール単位での認証)
  2. ユーザー単位での認証フロー