ここでcurlで公開鍵を登録する方法を紹介していたのだけど、GitHub全域でこれまでのユーザ名・パスワード・OTPによるBASIC認証が使えなくなったようだった。以下のようなエラーが返る。
{
"message": "Requires authentication",
"documentation_url": "https://docs.github.com/rest/reference/users#create-a-public-ssh-key-for-the-authenticated-user"
}
ではどうすれば良いかというと、Personal Access Tokenを利用する。
まず Personal Access Tokens から Generate new token を選択してPersonal Access Tokenを発行する。この際にpublic keysに関する権限をつけておく。

あとは以下で公開鍵を登録できるようになる。
curl -XPOST \
-H 'Content-Type: application/json' \
--basic -u '<user>:<personal_access_token>' \
-d '{"title": "user@hostname", "key": "<public_key>"}' \
'https://api.github.com/user/keys'
または以下のようにAuthorizationヘッダをつける形でも登録できるようだった。こちらの方がシンプルだと思う。
curl -XPOST \
-H "Content-Type: application/json" \
-H "Authorization: token <personal_access_token>" \
-d '{"title": "user@hostname", "key": "<public_key>"}' \
"https://api.github.com/user/keys"
登録した公開鍵はPersonal Access Tokenをrevokeすると削除される。あくまで一時的なものとして扱われるらしい。
一見 X-GitHub-OTP ヘッダをつけた方がセキュアなのではと思ったが、Personal Access Tokenを利用することで権限を絞って認可できるし一般的な認証方法に乗っかることができるから良いという話なんだろうか。個人的にはOSインストールの自動化のために利用しているのでPersonal Access Tokenをrevokeすると鍵が削除される仕様を若干不便に感じるけどその方がセキュアそうなので諦めるしかない。