頼りないニモニック

はっきりいって個人の日記レベル

Githubの2段階認証を有効にしてgitからの認証が弾かれる時の話

Github で2段階認証 (Two-factor Authentication; 2FA) が導入されました。それについての記事もあります。

https://github.com/blog/1614-two-factor-authentication

本日、この 2FA を有効にしたときにちょっとしたアクシデントがあったのでご紹介します。上記の記事にもばっちりと対処法が書かれていますがここでまとめておきます。

リモートリポジトリのプロトコルがHTTPだと認証に失敗する

見出しの通り。2FA を有効にしたとき、push 時に通常通りの ID/PW でアクセスすると認証に失敗します。

$ git push origin master 
Username for 'https://github.com': ***
Password for 'https://***@github.com': 
fatal: Authentication failed

すると冒頭の記事中にこんな記述が・・・

If you are using SSH for Git authentication, rest easy: you don't need to do anything. If you are using HTTPS Git, instead of entering your password, enter a personal access token. These can be created by going to your application settings page.

つまりプロトコルが HTTPS の場合に限り、自分でアクセストークンを作り、そのアクセストークンをパスワードの代わりに入力しろということです。指示に従いアカウントページからトークンを作り、表示されている16進のトークンを入力してみます。もちろんコピーアンドペーストでも大丈夫です。

$ git push origin master 
Username for 'https://github.com': ***
Password for 'https://***@github.com': 
Everything up-to-date

うまく行きました。要するにHTTPSの場合は毎回トークンを入力する必要があります。

それでは不便なので

SSH の場合は何もしなくても良いと書かれています。そもそも ID/PW を入力する必要がないので普段の利用は SSH を使ったほうが楽です。鍵の生成方法や登録方法は変わりませんので割愛します。

$ git remote -v
origin	https://github.com/***/***.git (fetch)
origin	https://github.com/***/***.git (push)
$ git remote set-url origin git@github.com:***/***.git
$ git remote -v
origin	git@github.com:***/***.git (fetch)
origin	git@github.com:***/***.git (push)
$ git push origin master 
Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts.
Everything up-to-date

私の場合、ポート開放の関係で SSH が使えない環境が一部あり、SSH が使えない状況に限り HTTPS で代替しようと考えています。

追記 (12/4)

Google Play には Github 用のアプリがあり、2段階認証設定時のログイン方法に悩んでいましたが、どうやら上記と同じように「自分でアクセストークンを作り、そのアクセストークンをパスワードの代わりに入力しろ」ということのようです。ちなみにこのアプリは一度 ID とアクセストークンを入力すれば二度目以降は入力の必要はないようです(無論、端末を変えれば再入力でしょうが)。

要約すると、2段階認証に対応したもの(SSH や GitHub 公式 Web など)は ID/PW とさらに場合によってはワンタイムパスワードを。

2段階認証に対応していないもの(HTTPS や アプリなど)は ID とアクセストークンを作成してパスワードの代わりに入力します。