Edited at

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の登録を行います。

auth.png

この時に 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"} が取れます。

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

sequence.png


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