LoginSignup
19
12

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-13

はじめに

ローカルの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

19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12