- blogs:
- cles::blog
python-o365 を使って O365 アクセストークンを取得する
office365 python oauth2Office 365(というか Exchange Online)に POP3 や IMAP、SMTP 接続しようとすると、いまのところは ID/PW による基本認証が使えますが、今年中にもこの機能が削除される予定*1になっているので、今後のことを考えると先進認証と呼ばれる SASL XOAUTH2 に対応させる必要があります。
Outlook や Thunderbird などのメーラーは設定を変更するだけですんなり対応できるので良いのですが、fetchmail などの非対話のコマンドラインツールなどを使おうとすると一気に面倒なことになります。基本的なやり方は以下にあるのですが、OAuth2 の設定するためには Azure AD などの仕組みについて理解する必要が出てきます。
† パスワードの代わりになるものはアクセストークン
そして、今回はパスワードの代わりに利用されるアクセストークンの取得処理を以下のライブラリと Python を使って実装してみました。
モジュール自体はいつものごとくpip install O365
でインストールできます。
† アクセストークンを取得するスクリプト
最もシンプルに書いてみたところ、こんな感じになりました。
get_token.py
比較的簡単なモジュールですが、いくつか落とし穴があります。
まず、SCOPES の部分ですが、Azure AD でのアプリ登録の画面では https://graph.microsoft.com/POP.AccessAsUser.All となっていますが、Outlook にアクセスするためには https://outlook.office365.com/POP.AccessAsUser.All のように読み替えないと、アクセストークンが取得できても認証が通りません*2。
また、python-o365 のバグなのか、以下のような感じで怒られるので、メッセージに従って無理やりパッチを当てました。
O365.diff
上手く認証ができると Authenticated!
や Refreshed!
のメッセージが表示され、token.json
ファイルにトークンの情報が、access_token
ファイルにアクセストークンが書込まれるようになっています。アクセストークンの有効期限は1時間*3なので、cron 等でこのスクリプトを定期的に実行し続ける必要があります。
- *1: 更新: Exchange Online の基本認証が非推奨となります | Microsoft Docs
- *2: java - Office 365 XOAUTH2 for IMAP and SMTP Authentication fails - Stack Overflow
- *3: Azure AD が発行するトークンの有効期間について | Japan Azure Identity Support Blog
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/12633
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
- シャープの空気清浄加湿器の... (1)
- SMARTEK デジタル温湿度計 (1)
2 . Word で数式がグレーアウトされていて挿入できないときは(15192)
3 . awk で指定した n カラム目以降を出力する(11774)
4 . アーロンチェアのポスチャーフィットを修理(11486)
5 . Windows 10 で勝手にログアウトされないようにする(9755)