Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@waiseiningenchokon

GNU Emacs + Gnus + Outlook.com + OAuth2 の環境を作ろう

はじめに

タイトルは大変お世話になったページのリスペクトです。

このドキュメントにダイレクトに来られた方は申し訳ありません。こっちのドキュメントの続きになっています。Gmail興味ねーよという方でも動かすまでの手順はリンク先のドキュメントに書かれているので、目を通してください。以下は目を通していただいた前提で書いています。

Emacs+Gnus+OAuth2でマルチアカウント対応を行ったので調子に乗ってGmail以外のアカウントにも手を出してみました。そうしたら結構大変だったのでその記録です。

Outlook.comのアプリ登録

Google様にアプリ登録しておんぶにだっこしてもらったように、Microsoft様にもアプリ登録が必要です。このドキュメントのメインはほぼこの節(section)です。2021年4月版です。変わる可能性があるので最新情報はググるかBingってください。

Auzre Portal

Mirosoft様の場合、アプリ登録を行うにはAuzre Portalを使用します。ログインアカウントはアプリ登録を行おうとしているアカウントです。ログインすると何か通知が来るかもしれませんが、最終的に以下のようになると思います。

Auzre Portal

Azure Active Directory

この画面の左上のメニューをクリックしAzure Active Directoryを選択します。

Azure Active Directory1

選択すると以下のような状態になると思います。

Azure Active Directory2

アプリの登録

左のナビゲーションに出ているアプリの登録を選択します。この画面は初期画面です。アプリ登録が存在すれば既存のアプリが表示されます(そんな人はこのドキュメント見る必要無いと思いますが)。上の新規登録を選択してください。

アプリの登録1

名前はなんでも良いです。ご自身で分かりやすい名前を設定してください。アカウントの種類は後でまた出てきますが、個人であれば画像通りで問題ありません。

アプリの登録2

client secretの追加

登録したアプリが選択された状態に遷移します。ナビゲーションもそれに合わせて変わります。証明書とシークレットを選択します。

client secret1

新しいシークレットの追加を選択します。ここで生成される値がclient secretになります。説明は入力しなくても大丈夫です。有効期限は個人使用なのでなしで良いでしょう。追加するとクライアントシークレットが追加され、値の部分にclient secretが表示されます。その横のIDはAzureの内部管理上のIDのことです。client idではありませんで注意してください。

client secret2

APIのアクセス許可(スコープの許可)

APIのアクセス許可を選択します。ここで選択した内容がOAuth2のスコープになります。選択が必要な内容は以下です。

  1. offline_access
  2. IMAP.AccessAsUser.All
  3. POP.AccessAsUser.All
  4. SMTP.Send

POPなんか使わねーからいらないだろうと思った方、私も最初はそう思ってました。でもこれを選択しないとSMTP AUTHにもOAuth2拡張が使えないのです。理由は不明です。このドキュメントの肝のひとつはここです。

APIのアクセス許可1
APIのアクセス許可2
APIのアクセス許可3
APIのアクセス許可4
APIのアクセス許可5
APIのアクセス許可6

最終的に以下のようになっていれば大丈夫です。
APIのアクセス許可7

プラットホームの追加

次に認証を選択します。
プラットホームの追加1

プラットホームを追加を選択しWebアプリケーションのWebを選択します。
プラットホームの追加2

リダイレクトURIには以下の内容を指定します。

https://login.microsoftonline.com/common/oauth2/nativeclient

プラットホームの追加3

この指定ですが、Gmailでは

urn:ietf:wg:oauth:2.0:oob

となっていた部分で、コード表示画面が表示される指定をしていたところです。Outlook.comにはコード表示画面は存在せず上のURLが使用されます。後で画面イメージもつけていますが、許可を行うと

https://login.microsoftonline.com/common/oauth2/nativeclient?CODE=XXXX

というURLに遷移します。CODE=の後ろのコードが許可コードなので、これをGnusのEnter the code youer browser displayed:に入力します。ここも肝のひとつです。

client idの確認

これでアプリの登録で入力が必要な部分は終了です。概要を選択してください。画面上はマスクしてますが、アプリケーション(クライアント)..:の部分に表示されている値がclient idです。先のclient secretとともに取得してください。

client idの確認

Gnusの設定

以下のような定義を行います。nnimapの横の文字列がグループ名になります。アカウント名等でも良いですが、ハイフンなど使えない文字もあるので英数字で定義した方が無難です。nnima-addressはIMAPサーバーのアドレスです。最新情報で変わっているようなら変更してください。

.gnus.el
(add-to-list
 'gnus-secondary-select-methods
 '(nnimap "outlook"
          (nnimap-address "outlook.office365.com")
          (nnimap-server-port 993)
          (nnimap-stream ssl)
          ;; Search
          (nnir-search-engine imap)))

nnimapのキーワードはグループ名になるのでgnus-permanently-visible-groupsを調整する必要があるかもしれません。outlookとした場合は以下のように指定します。

.gnus.el
(setq gnus-permanently-visible-groups "^nndraft:drafts\\|^nnimap\\+outlook:")

nnimapのキーワードとアカウントの紐づけのため.authinfoを定義します。outlookの文字列はnnimap側を変えたのなら合わせてください。SMTPサーバーの定義は、最新情報で変わっているようなら変更してください。

.authinfo
machine outlook login あなたのアカウント password notrecord
machine smtp.office365.com login あなたのアカウント port 587 password xoauth2

アカウントの定義は以下のようにします。

.gnus.el
(setq gnusimapoauth2-accounts
      '(
    (:user "あなたのアカウント"
           :smtp-server "smtp.office365.com"
           :smtp-port 587
           :smtp-user "あなたのアカウント"
           :smtp-password "notrecord"
           :smtp-auth-supported xoauth2
           :smtp-stream-type starttls
           :oauth2-client-id "[あなたのアカウントのclient id]"
           :oauth2-client-secret "[あなたのアカウントのclient secret]"
           :oauth2-scope "offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send"
           :oauth2-auth-url "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize"
           :oauth2-token-url "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
           :oauth2-redirect-url "https://login.microsoftonline.com/common/oauth2/nativeclient"
           )
    ))

:oauth2-scopeはアプリ登録で指定した許可したAPIの名前です。offline_accessとそれ以外で指定方法が違いますが、そういうものらしいので気にしないでください。同様に:oauth2-redirect-urlはアプリ登録のプラットフォームで追加したURIです。例通りなら合っていると思いますが、変えているなら書き換えてください。

テナント

このドキュメントによると、:oauth2-auth-urlと:oauth2-token-urlは以下のような形式になるそうです。

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

{tenant}のテナントの定義は以下のようになるそうです。

説明
common 個人の Microsoft アカウントと Azure AD の職場/学校アカウントのどちらでもアプリケーションにサインインできます。
organizations Azure AD の職場/学校アカウントを持つユーザーのみがアプリケーションにサインインできます。
consumers 個人の Microsoft アカウント (MSA) を持つユーザーのみがアプリケーションにサインインできます。
8eaef023-2b34-4da1-9baa-8bc8c9d6a490 または contoso.onmicrosoft.com Azure AD テナントのフレンドリ ドメイン名か、テナントの GUID 識別子のいずれかを使用できます。

わけが分からないですよね。私もよくわからずに、commonにして接続したら怒られまくりました。で、エラーコードなどを調べた結果、ようする以下のようなことだと分かりました。

ようするに サインインするときのアカウントの種類
organizations Microsoft365の有料outlookを使う場合。Exchange Onlineに繋げる場合 職場または学校アカウント IT部署が作成
consumers hotmail由来の無料outlookを使う場合。UIは変わっているけどWindows Live Mailに繋げる場合 個人のアカウント お客様が作成

同じアカウント(メールアドレス)に2つの接続先が発生してしまっているのは、Microsoft様の都合なので、OAuth2プロトコル的には知らないということになります。本当はプロトコルに職場のアカウントなのか、個人のアカウントなのを指定できれば良かったんでしょう。で、それではMicrosoft様は困るのでテナントというので、区分けしているみたいです。

今回のケースでは個人のアカウントの方を使うので、consumersを指定しています。ここも肝のひとつです。

私はExchange Onlineは使っていないので、多分になるのですが、アプリの登録をMicrosoft365が提供している組織のAzure ADで行えば、organizationsの指定も可能なんだと思います。その場合はアプリの登録時のアカウントの種類も組織ディレクトリ内のアカウントにする必要があると思います。

えっ。commonとか上以外のテナントの意味ですか? ここまでの説明した内容だけ分かれば接続できるので深追いしてません。こうやって中途半端な知識が増えていくんですよね。困ったもんだ。

2021/4/9の追記

気になったのでMicrosoft365の方で確認してみました。Enterprise E5のアカウントは持っているのです。やっぱりMicrosoft365のAuzre Portalで同じことを行えば、接続できるようになります。違いは以下の通りです。

  1. アプリ登録時のアカウントの種類は、『この組織ディレクトリのみに含まれるアカウント』にします。
  2. client secretの有効期限なしは選択できなくなります。最大3年というのが期限になります。

これ以外は一緒です。.gnus.elなどもテナント以外は同じでうまくいきます。でも許可時に職場または学校アカウントか個人のアカウントを選んでログインするので、テナントってあんまり意味ないような気がします。Microsoft様の都合なんですかね。詳細はわかりません。

SMTPの送信を行う場合は、SMTP AUTHを許可しないといけません。Microsoft 365 管理センターを開き、『ユーザ』->『アクティブユーザ』で該当ユーザを選択してください。その後、『メール』を選択し『メールアプリの管理』で『認証済SMTP』をチェックします。

この設定画面にはIMAPの許可などもあります。ここがチェックされていないとそもそもIMAPでアクセスできないので、うまく行かない場合は確認してみましょう。組織のポリシーで、この画面を出せないこともあるかもしれません。その場合は、頑張って説得してくださいとしか言えません。

デフォルトのメールフォルダの構成が大きく異なりました。以下のようになります。予定表もIMAPでアクセスできるみたいです。Exchangeってそういうものなんですか?この辺りの話はExchangeに詳しい人に確認してください。

フォルダ名
INBOX
アーカイブ
ジャーナル
タスク
メモ
下書き
予定表
予定表/日本の休日
予定表/誕生日
会話の履歴
削除済みアイテム
迷惑メール
送信トレイ
送信済みアイテム
連絡先

許可

ここまでくれば後は接続するだけです。M-x gnusで起動しましょう。minibufferにEnter the code youer browser displayed:というメッセージが表示され、ブラウザが起動します。接続許可の画面が以下のように出ます。

許可1

許可2

ここで許可すると先に説明したリダイレクトURIの画面になります。真っ白になるのでびっくりしないでください。CODE=の横をコピペしてminibufferに入力すればOAuth2認証完了です。

許可3

あとがき

昔、新世紀エヴァンゲリオンの考察同人誌というのを読んだことがあって、”あとがき”みたいな部分に、”この本を書く上でいろいろなことを調べた(死海文書?とか)。異論や反論があるなら、最低限自分と同じレベルの調査を行ってからじゃないと聞く耳持たない。”というようなことが書いてあって同人誌っていうのは凄い世界だなぁと思いました。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
waiseiningenchokon
ライナーノート。昔、映画アイアンマンの制作にOracleが協力した際、トニー・スタークのモデルは、ラリー・エリソンだと言い出したことがありました。 ラリー・エリソンのようなお金持ちになりたい。強烈な憧れを抱いていた私は、格好から真似しようと思いアイアンマンのマスクを購入しました。 しかし勿体なくて箱から取り出すこともできません。こんなにちいさい人間には、憧れることすら許されるはずはなかったのです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?