Office Devlopのいろは

Office系の技術を中心に、コアでニッチな話題を繰り広げます。

【Officeアドイン】OfficeアドインでSSOを有効化し、ログインを1回のみにする[Preview版]

はじめに

Officeアドインを開発時に気を付けなければいけない地雷まとめの「Officeのログイン者情報を、Officeアドインで取得することはできない」にも書いたのですが、Officeアドインの安定版では現在、「Officeにログインしているユーザー」を取得することはできません。
画像
どう考えても取れそうな「佐藤 裕」という情報が、残念ながら取得は出来ないのです。安定版では。

そのため、もし「Officeアドインで、Office365のユーザー情報を取得してゴニョゴニョする」というアプリを検討していたとしても、ユーザーに再度ログインを強要する必要があります。
これがクライアント版のOfficeならまだ良いのですが、Online版まで考えると本当に地獄。
アプリがiframeで実装されているがゆえに、認証できず、dialogを表示する必要が出てしまいます。
※これもOfficeアドインを開発時に気を付けなければいけない地雷まとめの「認証が絡む場合、Office Onlineには本当に注意」を参照

しかし、これがPreviewでは、一部できるようになります!
Office系、それもAzure AD v2でのログインに限り、SSOとして、Officeのアプリにログインしている情報(正確にはアクセストークン)を取得できるようになるわけです。
そのため、ユーザーはわざわざ2回目のログインを行う必要がなくなるわけですね。

今回は、この「Office アドインのシングル サインオン」の概要をご紹介します。
検証はまだなので、触りのみとなってしまうことをご了承ください。

概要

基本的にはこちらの公式サイトをご参照ください。 docs.microsoft.com キーポイントをかいつまんで解説します。

流れ

f:id:hsatou_kajitori:20190522000532p:plain
※引用:Office アドインのシングル サインオンを有効化する - Office Add-ins | Microsoft Docs

ざっくり流れをまとめると、以下のとおりです。

  • Officeアプリ(各開発者が開発するWebアプリ)内のjsファイルで、getAccessTokenAsync関数を実行する

  • getAccessTokenAsync内の処理で、Officeプログラム(ExcelやWordの本体)に、現在ログインしているユーザー情報を取得するよう要求する

  • Officeプログラムにログインしていない場合、ログインするようユーザーに要求するダイアログを表示する

  • Officeプログラムは、Azure AD v2エンドポイントから、現在のユーザーのアドイン トークを取得する

  • Officeプログラムから、getAccessTokenAsync関数の処理として、Officeアプリに、アドイントークンを返却する
    →アドイントークン(JWT)を解析して、ログインユーザーのメールアドレスなどを取得する

ユーザー情報などを取得するのみであれば、ここまでで処理は終了なのですが、Microsoft Graphなども絡める場合、以下の処理も必要になります。

  • Officeアプリから、サーバーサイドにアドイントークンを送信する

  • サーバーサイドで、Microsoft Graphなどで使用できるアクセストークンを取得し、Officeアプリに返却する

このような処理になります。

注意点

ここからは、現在分かっている注意点を記載します。やはり地雷は多し。

Office Insiderに参加が必要

2019/05/21現在、プレビュー版のみ対応であるため、「Office Insider」に参加する必要があります。
参加した上で、プレビュー版のOfficeをインストールする必要があります。

Office2013や2016には非対応

これがとっても大事ですね。
SSOは「IdentityAPI」という要件セットが必要で、これはOffice2013や2016は非対応です。恐らく今後も。
なので、このSSOを対応させるのであれば、2013や2016を切り捨てる必要がありますね。

サーバーサイドの実装が必要

これは実際のサンプルコードで実装した時に解説予定なのですが、Microsoft Graphなどのトークンを活用したい場合には、サーバーサイドの実装が必要になります。
通常のhtmlとjavascriptだけのアプリを開発しよう!と思っても、それはNGなんですね。vueとかReactとかも多分NG。

今回取得できるトークンは、あくまでも「アドイントークン」で、Microsoft Graphのアクセストークンではありません。
Microsoft Graphのアクセストークンを取得する際には、別途サーバーサイドの処理が必要、ということを覚えておいてください。

まとめ

このように、どうしても限定的な範囲にはなってしまいますので、これはOfficeストアのような全体公開向けのアプリではなく、組織内でのアプリの方が向いているかもしれないですね。
また、現在はプレビュー版なので、いずれにせよ正式版に採用は難しいです。

それでもメリットは十分にあります。Office365前提のアプリであれば、非常に便利な機能になることは間違いないです。

実装の検証と、具体的な解説は次回行う予定です。ぜひお待ちください。