Emacs
emacs-lisp
auth-source
EmacsDay 23

Emacsで認証情報を扱うためにはauth-sourceを使おう

More than 3 years have passed since last update.

はじめに

Webサービスと連携しようとすると、ついてまわるのが認証情報の取り回しです。

気の利いたもので、Emacsにはそういったセンシティブな情報を統一的に扱うための方法が標準で用意されています。
その名も auth-source です。

今回は、古典的なユーザID・パスワード認証が必要なWebサービスを例にして、具体的な利用方法をまじえて auth-source の紹介をしようと思います。

auth-source

Emacsで困ったら答えはおおよそ Infodescribe-function あたりで求められます。
おもむろに M-: (info "(auth)Top") とタイプすれば、すべてはそこに載っています…が、ここでは敢えてかいつまんだ説明を試みます(Auth-source の Info は結構短めなので全部目を通してみるのも良いと思います)。

パッケージ作成者として

It is a way for multiple applications to share a single configuration
(in Emacs and in files) for user convenience.

Info にある通り、auth-source は異なるアプリケーション間で同じ設定を共有することでユーザの利便性を向上させるものです。

逆に言うと、パッケージ作成者も同じ仕組みに乗っかっておけば、あとはよしなにやってくれるので、本当に解決したい問題に集中できます。

その利用方法は至ってシンプルで、auth-source-search 関数を利用して認証情報を取り出す、これだけです。

auth-source では、ホスト名(:host)とポート (:port)をキーに情報を保存できます。

保存できるのはユーザ名(:user)とパスワード(:secret)、その他任意のキーを保存できます。

上記の各項目に対応するキー名は原則固定なので変えてはいけません(:hostに対応する :machine など、別名がある場合もあります)。

ユーザの設定によって平文(.netrc)で保存されたり、GnuPG で暗号化されたりしますが、具体的な保存形式については隠蔽されているため、パッケージ作成者は気にしなくて大丈夫です。

具体例: ガルーン API

具体例を見てみましょう。

以下は Garoon API – cybozu.com developer network を利用するためのユーザ名とパスワードを取得・保存するコードです(仕事でガルーンのお世話になっている人も多いはず…?)。

https://github.com/yewton/garoon.el/blob/0.1.x/garoon.el#L130-L141

これだけで、もし保存された認証情報があればそれを利用し、なければユーザに問い合わせた上で保存する、ということが可能になります。

便利ですね!

テスト

テストの仕組みもこれまた標準で用意されていますので M-: (info "(ert)Top") を見てみましょう。

こちらはさっさと具体例をしめします。

以下のように、テスト時に平文の認証情報ファイルを利用するようにカスタマイズ変数を設定し、
https://github.com/yewton/garoon.el/blob/0.1.x/test/test-helper.el#L19

以下の様なファイルを用意してあげれば自動テストを実行できます。
https://github.com/yewton/garoon.el/blob/0.1.x/test/.authinfo

先程も書きましたが、具体的な保存形式はパッケージ作成者側は気にしなくてよいというのが嬉しいところです。

利用者として

これまでパッケージ作成者としての利用方法について述べてきましたが、
ユーザとしてこの仕組を利用する上でひとつ注意しなければならないのは、
デフォルト設定だと平文で認証情報が保存される という点です。

auth-sources のデフォルト値が '("~/.authinfo" "~/.authinfo.gpg" "~/.netrc") であるためです。

Emacs では GnuPG で暗号化されたファイルを透過的に扱うための EasyPG という仕組みがあります(M-: (info "(epa)Top"))。
auth-source でも拡張子が gpg である場合に、自動的に暗号化するようになっています。

そのため、実際に自分が利用する際には、(custom-set-variables
`(auth-sources '(,(expand-file-name "authinfo.gpg" user-emacs-directory))))
のように設定しておくことをオススメします!

ちなみに、ソースを見る限り、Mac OS X のキーチェーンと連携することも可能なようです…が、僕の力不足でどのように利用すればよいかまで調査することができませんでした :frowning:

少なくとも、現時点では Emacs からの情報保存には対応していないようです。

最後に

以上、auth-source を利用する方法について簡単にまとめました。

実は、auth-source は僕が認証情報の扱いに困っていた時に @rubikitch さんに相談して教えていただいたものです。
丁寧に相談にのって頂いてありがとうございました。

また、Emacsの設定ではパスワードとかは直書きせずauth-source使うと良いよ - 死ぬまでの暇潰し 及び (info "(auth)Top") は大いに参考にさせていただきました。
この場を借りてお礼を申し上げます。

おまけ: garoon.el について

org-mode で出来ないことはないだろうと思い、スケジュールやタスク管理に関わるものをすべて org-mode 上で行いたいというのが、取り組み始めた動機でした。

ところが、いざ始めてみると、ガルーンの複雑な状態遷移や反復条件を org-mode で表現するにはどうすればよいのか、試行錯誤の連続です…。
繰り返し予定にフォローが書き込まれると、その日の予定だけ別IDが採番されて、かつ元の繰り返し予定の方には「除外日時」というものが設定される仕組みだったり、
第二月曜日とかの曜日指定の反復が org-mode で簡単には表現できなかったり。。

ということでまだまだ取り組み始めたばかりですが、なんとか org-mode の上にガルーンを乗せられるように頑張って行きます :smile:

現在は指定日の予定を表示することしか出来ませんが、追加で以下の様な機能を取り入れるつもりで取り組んでいます:

  • ファイルへの永続化と非同期シンク
  • MTG 議事録作成の補助機能
  • org-agenda-custom-commands の提供
  • org-capture を利用したフォローの書き込み