mu4eを MS の OAuth2に対応させる
タイトルが正確じゃないかも知れませんが、やりたいことはそうなので そういう内容です。大学のe-mailを提供している MS の Office365 のOutlook が とうとう LOGIN 認証を認めなくなってしまったので重い腰を上げた次第。 何とか mu4e (isync(mbsync), msmtp) でOAuth2認証できるようになりましたが、 なんかとても面倒くさかった。
mu4eって何?という方はこばやしの別記事をどうぞ。
0. prerequisites
OAuth 認証をやってくれる外部ツールが必要で、いくつかあるようなのですが 3つほど試して次の2つが何とか使えたのでこれらで行きます。MSだけで 良いならoauth2msの方が設定項目が少なく、運用時もひと手間省けて楽です。
oauth2ms
まさにMSのO365専用に作られたPythonツールです。oauth2token
こっちはGoogleなどもいける汎用ツールです。pip でインストールできるのは楽だけど、認証を行うコマンドと、トークンを出力するコマンドとに分けられているのが(使用時に)面倒くさい。
あとはOSにもよると思いますが、Debian の場合は以下のライブラリをインストールする必要がありました。
- libsasl2-modules-kdexoauth2
sudo apt install libsasl2-modules-kdexoauth2
でok。
1. Azureの設定
Azure側でアプリを登録します。 このアプリが oauth2ms であり oauth2token です。 詳しくはoauth2msの解説ページ を参照してください。
azure portalを開きます。
Azure active directory へと進み、「+追加」→「アプリの登録」
名前は適当に mail とかつけます。サポートされているアカウントはデフォルトのままでいいと思います。リダイレクトURIはあとから入力することにしてとりあえず省略。
「アプリケーション(クライアント)ID」と「ディレクトリ(テナント)ID」を控えておきます。
「証明書とシークレット」へと進み、「+新しいクライアントシークレット」をクリックします。 作られたシークレットの「値」の方を控えます。この値は今後参照できなくなるのでしっかり 控えましょう。
「APIのアクセス許可」へと進み、「+アクセス許可の追加」をクリックし、「Microsoft Graph」 →「委任されたアクセス許可」から以下を追加します。
IMAP.AccessAsUser.All
User.ReadBasic.All
SMTP.Send
「認証」へと進み、「+プラットフォームを追加」をクリックし、「Web」を選択し、リダイレクトURIに……
- oauth2ms (次節)を使う場合は
http://localhost:5000/getToken
- oauth2token (次々節)を使う場合は
http://localhost
と入力します。そして「サポートされているアカウントの種類」をマルチテナントにし、さらに「パブリッククライアントフローを許可する」を「はい」にします。
- oauth2ms (次節)を使う場合は
2-a. oauth2ms の設定(次節のoauth2tokenとどちらか一方でok)
公式ページを見てインストールします。だいたいこんな流れです。
$ git clone https://github.com/harishkrupo/oauth2ms (クローンされる) $ cd oauth2ms $ pip install -r requirements.txt --user (必要なモジュールがインストールされる) $ sudo cp oauth2ms /usr/local/bin #←これはお好みで。
~/.config/oauth2ms/
というディレクトリを作って、以下のconfig.json
を作ります。// config.json { "tenant_id": "上で控えたテナントID", "client_id": "上で控えた「アプリケーション(クライアント)ID」", "client_secret": "上で控えたシークレットの「値」", "redirect_host": "localhost", "redirect_port": "5000", "redirect_path": "/getToken/", "scopes": ["https://outlook.office.com/IMAP.AccessAsUser.All"] }
ターミナル上で
oauth2ms
を実行します。ブラウザの認証画面が開き、認証が終わったらターミナルにトークンが出力されればok。
2-b. oauth2token の設定(前節のoauth2msとどちらか一方でok)
pip install oauth2token --user
でインストールします。~/.config/oauth2token/microsoft/
(microsoftの部分は自分で決める識別名)という ディレクトリを作って、以下のconfig.json
、scopes.json
を作ります。 oauth2tokenの公式ページ参照。// config.json { "web": { "client_id": "上で控えた「アプリケーション(クライアント)ID」", "client_secret": "上で控えたシークレットの「値」", "auth_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "token_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/token" } }
// scopes.json
["https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com
/SMTP.Send"]
- とりあえずここまでやって万事うまくできていれば
oauth2create microsoft <アカウト>
としていつものweb認証ができるはず。 その後、エラーなく終了すればok。さらにoauth2get microsoft <アカウント>
で トークンが出力されるはず。
3. .mbsyncrc
の修正
現在 LOGIN 認証で動いているのであれば AuthMechs と PassCmd を修正するだけで大丈夫なはずです。
AuthMechs XOAUTH2
PassCmd "oauth2ms" # oauth2msの場合
PassCmd "oauth2get microsoft <アカウント>" # oauth2tokenの場合
4. .msmtprc
の修正
現在 LOGIN 認証で動いているのであれば auth と passwordeval を修正するだけで大丈夫なはずです。
auth xoauth2
passwordeval "oauth2ms" # oauth2msの場合
passwordeval "oauth2get microsoft <アカウント>" # oauth2tokenの場合
で、これで ok な人は ok です。ところが、環境によっては
メイル送信時に oauth2ms で permission denied
のエラーが出てしまう場合があります。これはAppArmorの
仕業かもしれません。その場合は、/etc/apparmor.d/usr.bin.msmtp
を変数してホワイトリストに oauth2ms を
加えます。以下のような感じです。
(前略)
owner /tmp/* rw,
/usr/local/bin/oauth2ms PUx, # この行を追加
/usr/bin/secret-tool PUx,
(以下略)