コンソールからコマンドでgithubにpushしようとすると私の環境ではパスワード入力ダイアログが表示されます。そこでパスワードを入力してOKを押すと、更に下の画像のように先ほど入力したパスワードをユーザ名としてもう一度パスワードを聞かれます。
なんじゃこれは〜!毎回こうなるのでイライラする🙄
いつもここでCtrl+Cで抜けるんですが、もう一度正しい認証情報を入れようとすると(パスワードを入力してしまった)ユーザ名は修正できずに、パスワードばかり聞かれるようになります。ひどい!
このことは、バグとして報告されているみたいです。
📕ksshaskpass asks for username with password dialog, allowing mistaken pass to become part of URL
何が起こっているのか
ちょっと何が起こってるのかわかりにくいので、整理してみます。
私の環境はfedora36でデスクトップはKDEを使っています。
認証情報を入れるときのウィンドウにはksshaskpassと表示されているのですが、これはsshログイン時の認証をするときにKDEの環境で利用されるユーティリティのようです。今回はsshでの接続ではないのですが、gitのアクセストークンを使った認証にも使われるのですね。ksshaskpassに認証情報を入力するとkwalletに入ります。kwalletとはKDE標準のパスワードを管理するものです。
それで、このksshaskpassが何でgitの認証時に起動されるのかというと、環境変数のSSH_ASKPASSにksshhaskpassが設定されているからです。gitはSSH_ASKPASSに設定されたヘルパーがあれば、それを使います。確認してみると確かにSSH_ASKPASSにksshaskpassへのパスが設定されていました。
で、今度はkwalletマネージャーを開いてkwalletに保存された情報を見てみることにします。アプリケーションランチャーからkwalletマネージャーを開きます。
ksshaskpassフォルダを開いてその下の「パスワード」の項目のhttps://github.com
を見ると、さっき間違えて入力したパスワードが保存されていました。
とりあえずここら辺を踏まえて修正してみようと思います。
解決方法
解決方法には、ksshaskpassの変な挙動には目をつむってkwalletマネージャーの情報を修正して引き続き使用する方法と、もうksshaskpassを使わない方法の2つを確認しました。
kwalletマネージャーの情報を修正する方法
kwalletマネージャーを開いて、ksshaskpassフォルダを削除します。
そして、コンソールに戻りgit pushするとksshaskpassのダイアログが出てくるので、今度ははじめにユーザー名を入力しRemember passwordにチェックを入れてOKします。次に開くダイアログにはパスワードを入力してRemember passwordにチェックを入れてOKします。これでkwalletに認証情報が正しく保存されてgitの認証を毎回聞かれなくて良くなります。
Default keyringの作成ダイアログが出てきてしまう場合は、そのダイアログをキャンセルしてOSを再起動するとkwalletだけを使うようになってうまく行きました。
ksshaskpassを使わない方法
SSH_ASKPASSの指定を削除するとksshaskpassが起動しなくなり、kwalletではなくて同等の機能の別のユーティリティが使われるようになるのでこれで解決できます。
$ export SSH_ASKPASS=""
私の環境ではgnome-keyringが使われました。
そもそもgit-credential-libsecretって何してるの?
いつもgitの認証は、出来たら何でもいいやという感じであまり深く見てなかったのですが、せっかくのなのでgit-credential-libsecretについても理解してみました。
gitの認証情報の保存方法は、git config --global credential.helper
を使って指定できて、例えばcache,store,libsecretなどが指定します。この指定したものがヘルパーと呼ばれています。ここのプログラムは独立しているので用途に合ったヘルパーを自分で実装してみることもできるようです。
私の環境ではヘルパーにgit-credential-libsecretを指定しています。libsecretはD-Busを使ってSecret Serviceとやりとりするものらしく、このSecret Serviceというのは、秘密の情報を安全に保存するための仕様のことを言っているようです。
で、KDE Frameworks 5.97.0 以降からKwalletはこのSecret Serviceをサポートするようになったので、libsecretでKwalletが使えるようになっており、実際私の環境ではgitの認証情報の保存にKwalletが使われています。このSecret Serviceの仕様を満たしていれば、Kwalletでなくても他の認証情報を保存する同じような仕組みが使えるみたいです。もともとはgnome-keyringが使われていたようなので、gnome-keyringは普通に使える。で、認証情報を保存して管理しておけるこういった仕組みをKeyringと言っているようですね。
📕KDE Wallet
📕What is: Linux keyring, gnome-keyring, Secret Service, and D-Bus
ということで、git-credential-libsecretは認証情報をSecret Serviceに基づいて安全に保存したり取り出したりするもののようです。
その他気になったこと
もともとはkwalletって私の環境では使われてなかったと思うのですよね。
過去のwifiドライバを入れる記事でgitの認証情報を保存しておく設定をしているのですが、このときはksshaskpassは立ち上がらずにコンソールで認証情報を入れているし。いつの間にかkwalletに保存するようになっていました。どういうことなんだろう、うーん。
時間のあるときにD-Busについても知りたいなーとか思ったりしました。おしまい。