GitHub APIの仕組みを知り、APIでrepositoryを作成しよう


はじめに

ローカルのGitリポジトリをGItHub等他サービスに丸ごと移植する方法をスクリプト化したのはいいのですが、一つ一つ手動でUIから空リポジトリ作成するの?めんどくさくない?
というわけでGitHubのリポジトリをコマンドベースで作成する方法を探しました。結論を言うと GitHub API v3 を使えばいいです。
また、APIを使う為には OAuth認証 を行う必要があります。

GitHubの認証 - Authorizing OAuth Apps

Access Tokenを発行して使う。発行はUIから可能

GitHubでは、APIを利用する為にAccess Tokenを取得する必要があります。
ちょっとAPIを使いたいだけならtokens から New personal access tokenを選択すればOKです。

APIを利用したAccess Tokenの生成も可能

例えばアプリケーション等でAccess Tokenを発行する仕組みを作る場合の流れは以下となります。

  1. OAuth Appsを登録⇒Client IDとClient Secretを取得
  2. Client IDを使い、Authorize APIで認証⇒Codeを取得
  3. Client ID, Client Secret, Codeを使い、access_token APIを実行⇒Access Tokenを取得
  4. 以降はAccess Tokenを使ってリポジトリの操作

OAuth的に言うと、OAuth Appsを登録する場所が認可サーバー

最初にこちらからOAuth Appsの登録を行います。

この時に Authorization callback URL というのを登録するのですがこれが特徴的です。次のAuthorization API (https://github.com/login/oauth/authorize?client_id=$CLIENT_ID&scope=repo) を実行するとその応答にCodeが入ってくるわけではなく、Authorization callback URLにcode=${code}のqueryとして渡されます

そのままAccess Tokenが発行されるわけではなく一旦Codeがクライアント側が登録したアプリケーションに送信されるというのが面白いですね。容易にAccess Tokenが発行できないようガードを強固にしたい場合に考慮したとかそんな感じなのかなと予想。

また、Codeはqueryで指定され、該当ページにリダイレクトされる形になるので、callback URL用のサーバーを用意しなくても、頑張ってqueryを覗いて自分でAPIをコールしてもOKです。

Private repositoryの参照について

Defaultだと、このaccess tokenではprivate repositoryが参照できません。これも上記access token設定の為です。
repo: Full control of private repositories を設定すればOK。

参考: GitHub API v3 でプライベートリポジトリの情報が取れない問題の解決方法

利用サンプル

GitHub API v3 でリポジトリを作成して、ファイルをコミットするを参考にさせていただき、サンプルツールを作りました。
外部サーバーに置いてcallback URLに登録しておけば、https://github.com/login/oauth/authorize?client_id=$CLIENT_ID&scope=repo のresponseで {"access_token":"yyyy"} が取れます。

シーケンスに起こすとこんな感じですね。

Access Tokenが取れたら GitHub API v3を利用

上記のAPI仕様書を見ていると、RESTだけでなく色々な用途が充実してますが、とりあえずrepositoryの作り方だけ紹介。同じくGitHub API v3 でリポジトリを作成して、ファイルをコミットするに詳しく使い方が紹介されています(もう全部参考元を見ればいいんじゃないかな)

APIの認証は、Access TokenをAuthorization: bearer AccessToken でHTTP headerに設定することで成立します。
後は https://api.github.com/user/repos APIにBodyでrepository名を指定してPOSTすればOKです。

curl -H "Authorization: bearer $TOKEN" -X POST \
    -d "{"name":"repository name","auto_init":true or false, "private": true or false}" \
    https://api.github.com/user/repos

一応こちらもサンプルツールにスクリプト化して入れています。

参考

公式
GitHub API v3
Authorizing OAuth Apps

参考記事
GitHub API v3 でプライベートリポジトリの情報が取れない問題の解決方法
GitHub API v3 でリポジトリを作成して、ファイルをコミットする
アプリ目線でのGitHub OAuthの話[iOS]OAuth認証を極める(GitHubAPIで学ぶOAuth認証のフロー)
こんな感じでとても分かりやすくまとめられていました。

repos.png