リモートワークを導入する企業が増えたことに伴い、さまざまな社内コミュニケーションツールが登場し、広く利用されています。その一つが、Microsoftが提供するコラボレーションプラットフォーム「Microsoft Teams」です。Fessでは、このMicrosoft Teams上での会話も検索対象にすることができます。
今回は、MicrosoftのクラウドID基盤「Azure Active Directory (Azure AD)」を使ったSSO環境で、Microsoft Teams内に作成されたチャネルでの会話をクロールして検索する方法を紹介します。チャネルで設定されたアクセス設定をクロール時に取り込めるので、権限が付与されているチャネルの会話のみ検索が可能です。
なお、今回はFess 13.15.0を使用して説明します。
ユーザー認証の設定
会話の閲覧権限があるユーザーだけに検索結果を表示するためには、Azure ADで管理されているユーザー情報を利用します。Azure ADとの連携方法については本連載の第30回の記事を参照してください。
プラグインのインストール
チャネル内の会話をクロールするためには、「fess-ds-office365プラグイン」が必要になります。Fessを起動後、fess-ds-office365プラグインをインストールします。
管理者としてログインし、管理画面の左メニューで「システム」→「プラグイン」をクリックします。画面左上の「インストール」をクリックして、インストールするプラグインを選択します。ここでは、プルダウンメニューから「fess-ds-office365-13.15.1」を選択し、「インストール」ボタンをクリックしてプラグインをインストールしてください。
インストール後、プラグインの一覧画面を表示して「fess-ds-office365」が表示されていることを確認します。
クロール用アプリの登録
次に、クロール用のアプリをAzure ADに登録します。Azure Portalにログインし、「Azure AD」→「アプリの登録」をクリックします。
「新規登録」をクリックして、「名前」欄にアプリの名前を入力します。ここでは、「Fess-Crawl」としました。「サポートされているアカウントの種類」については以下のように設定し、「登録」ボタンをクリックします。
左側に表示されている「証明書とシークレット」→「新しいクライアントシークレット」をクリックします。「説明」欄への入力は任意ですが、今回はアプリと同じ名前を入力しておきます。有効期限を選択し、「追加」ボタンをクリックしてください。
追加されたシークレットの値をコピーしておきます。この値は再度表示されないため、別画面に遷移する前に記録しておいください。
次に「APIのアクセス許可」画面で「アクセス許可の追加」ボタンをクリックします。APIは「Microsoft Graph」を選択します。
「APIアクセス許可の要求」で「アプリケーションの許可」を選択し、以下のAPIを検索して追加します。追加後、「(テナント名)に管理者の同意を与えます」をクリックしてアクセス許可を付与します。
- ChannelMember.Read.All
- ChannelMessage.Read.All
- Chat.Read.All
- ChatMember.Read.All
- Group.Read.All
- User.Read.All
上記の設定に加えて、メッセージのAPIアクセスに関しては、Microsoftに利用申請を行う必要があります。公式ドキュメント「Protected APIs in Microsoft Teams」を参照して、フォームより利用申請をしてください。
クロール設定
クロール設定の前に、Azure Portalで「Azure Active Directory」の「テナントID」を確認します。
Azure Portalにログインして「Azure Active Directory」をクリックすると、「概要」画面が表示されます。基本情報に「テナントID」が表示されているので、これをコピーしておいてください。
次にFessの管理画面にログインします。「クローラ」→「データストア」→「新規作成」を開き、クロール設定を作成します。設定が必要な項目は以下の4つです。
- 名前
- ハンドラ
- パラメータ
- スクリプト
「名前」には任意の文字列を入力し、「ハンドラ」は「TeamsDataStore」を選択してください。
「パラメータ」は、以下のように入力してください。
- tenant=テナントID
- client_id=クロール用アプリのクライアントID
- client_secret=クロール用アプリのクライアントシークレットの値
- title_timezone_offset=+9
- title_dateformat=yyyy/MM/dd HH:mm
「スクリプト」は、以下のように入力してください。
- title=message.title
- content=message.content
- mimetype=”text/plain”
- created=message.created_date_time
- last_modified=message.created_date_time
- url=message.web_url
- role=message.roles
取得できる値のキーと値の説明は以下の通りです。「message」は投稿した会話を指しています。
キー | 値 |
---|---|
message.id | messageのID |
message.body | messageのコンテンツ |
message.channel_identity | messageのチャネルID情報 |
message.chat_id | messageのチャットID |
message.created_date_time | messageの作成日時 |
message.deleted_date_time | messageの削除日時 |
message.etag | messageのバージョン番号 |
message.from | messageの送信者の詳細 |
message.importance | messageの重要性 |
mmessage.last_edited_date_time | messageの編集日時 |
message.last_modified_date_time | messageの更新日時 |
message.locale | messageのロケール |
message.mentions | messageのメンションリスト |
message.reply_to_id | messageの返信元のメッセージID |
message.subject | messageの件名 |
message.summary | messageの概要 |
message.web_url | messageのURL |
message.roles | messageのアクセス可能なロール |
message.parent | messageの返信元のメッセージ |
クロールの実行
クロール設定ができたらクロールを実行してみましょう。
管理画面の左メニューの「システム」→「スケジューラ」で「Default Crawler」のジョブを開きます。「今すぐ開始」をクリックしてクローラを開始し、ジョブの状態が「実行中」から「有効」になるまで待ちます。
検索
検索画面には、「http://localhost:8080/sso/」でログインしてからアクセスできます。Microsoftのサインイン画面が表示されるので、Azure ADに登録されているアカウントでサインインしてください。
認証が成功すると検索画面が表示されるので、検索フォームに検索語を入れて検索してみましょう。検索結果には、ログインしているユーザーがアクセス権限を持っているドキュメントだけが表示されます。
今回は、Azure ADを用いたSSO環境で、Microsoft Teams内の閲覧権限があるメッセージを検索する方法を紹介しました。社内の共有フォルダなども含めて横断検索できるようにすると、より利便性は高まると思います。Microsoft Teamsを利用している場合は、Fessを使った検索環境の構築を検討してみてください。
著者紹介
菅谷 信介 (Shinsuke Sugaya)
Apache PredictionIOにて、コミッター兼PMCとして活動。また、自身でもCodeLibs Projectを立ち上げ、オープンソースの全文検索サーバFessなどの開発に従事。
本連載の内容やFessに関するご質問は公式フォーラムまで。