これまでの苦労について
Gitでプライベートレポジトリからcloneしたり、プライベート・パブリック関係なくpush/pullするときには、基本的に認証が必要になると思います。
ただ、これを行うにはかなりめんどくさい手順をふまなければいけませんでした...
(もはやスタンダードになっている)Githubの例:
少し前にパスワード認証が廃止されてしまったので、トークンを発行するか、ssh認証が必要。
1. トークンの発行
アカウント設定→デベロッパ設定→アクセストークンで作る。大抵の場合repoスコープをつける。
(なお、これも途中で新たなトークンが生まれたため、ただレポジトリにアクセスしたいだけなのにいろいろと大変。特にトークンの期限管理などがDALL・E(問題発言))
2. ssh認証
ssh認証鍵(秘密鍵か公開鍵か忘れて見に行ったら公開鍵やん!ってなったとか言えない)をgithubに登録した上でgit@github.comにsshを飛ばす。このときssh_configをいじる必要もあってDALL・E(再び多方面に喧嘩を売る)
そんな あ・な・た・に
ぴったりなものがあります。git-credential-oauthです。
なんでや!GCM(Git-Credential-Manager)があるやろ!と思った方へ...
確かに、この場面でよく使われているものだと考えますが、GCMはMicrosoft様の.NETフレームワークが必要で、これをインストールする必要があって(↑のReadmeにもあると思いますが)あまりにもオーバーヘッドが大きいように思えたのでこちらを選択しました。ちなみに筆者のメイン環境はLinuxです。
設定すると、push/pull/clone時にoauthの認証ページを自動的に(毎回ではなく一定期間ごとに)ブラウザで開き、それだけで認証が完了します。
これにより、そもそもの操作が減り、一定期間ごとに認証をブラウザの認証ページを通して行うので、2段階認証・他要素認証を利用することもでき、実質的にトークン管理の自動化が可能です。
サーバなどのブラウザがない環境では表示されるURLをクリックすることで認証を行えます(なお、現状ではGithubに限る)。
Github、Gitlabのほか姉妹プロジェクトでAzure、エンドポイントの設定を行うことでその他のOauthでの認証を提供するGitレポジトリマネージャ(セルフホストも可)において利用することができます。
そして、なんと言ってもGCMとの差はGoで書かれていることによる移植性の高さ、バイナリの小ささがあります。現状では主要な環境はすべてサポートしているようです。
Get started
まず、リリースページからgitコマンドのプラグイン?として動作するバイナリを入手します。そして、入手したバイナリをPATH内(説明省略)に置きます。
ここではリリースページから手動でダウンロードという説明をしていますが、公式ページにある通り、パッケージマネージャにてインストールが可能な環境もあります。その場合はありがたく利用するのが良いと考えます(個人的意見)。
次に、以下のコマンドで有効化します。
git credential-oauth configure
ただし、サーバなどで利用している場合は
git credential-oauth configure -device
を実行してください。
これでひとまず基本的な設定は完了しました。
実際にcloneなどを行ってみてください。
なお、Gitlabを利用している場合は以下の設定が必要です。
- gitlabでoauth applicationを作成(scope read_repository write_repository, redirect_url http://127.0.0.1)
- 以下のコマンドを実行してレポジトリを登録
CLIENTIDには前項で作成したOAuth client_idを、gitlab_hostにはgit.example.comのようなgitlabのホスト名を入れてください。
git config --global credential.https://<gitlab_host>.oauthClientId <CLIENTID>
git config --global credential.https://<gitlab_host>.oauthScopes read_repository write_repository
git config --global credential.https://<gitlab_host>.oauthAuthURL /oauth/authorize
git config --global credential.https://<gitlab_host>.oauthTokenURL /oauth/token