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

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

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

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

# `auth-source`
Emacsで困ったら答えはおおよそ `Info` と `describe-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
具体例を見てみましょう。

以下は <a href="https://cybozudev.zendesk.com/hc/ja/categories/200157760-Garoon-API">Garoon API – cybozu.com developer network</a> を利用するためのユーザ名とパスワードを取得・保存するコードです(仕事でガルーンのお世話になっている人も多いはず…？)。

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 さんに相談して教えていただいたものです。
丁寧に相談にのって頂いてありがとうございました。

また、<a href="http://aki2o.hatenablog.jp/entry/2014/09/20/Emacs%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%AF%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%A8%E3%81%8B%E3%81%AF%E7%9B%B4%E6%9B%B8%E3%81%8D%E3%81%9B%E3%81%9Aauth-source%E4%BD%BF%E3%81%86%E3%81%A8">Emacsの設定ではパスワードとかは直書きせずauth-source使うと良いよ - 死ぬまでの暇潰し</a> 及び `(info "(auth)Top")` は大いに参考にさせていただきました。
この場を借りてお礼を申し上げます。

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

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

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

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

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