はじめに
ローカルの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を発行する仕組みを作る場合の流れは以下となります。
- OAuth Appsを登録⇒Client IDとClient Secretを取得
- Client IDを使い、Authorize APIで認証⇒Codeを取得
- Client ID, Client Secret, Codeを使い、access_token APIを実行⇒Access Tokenを取得
- 以降は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認証のフロー)
こんな感じでとても分かりやすくまとめられていました。