Azure Active Directoryを使ってLINE WORKSのSSOを設定してみる！

# 今回のテーマ
* LINE WORKSのSSOを使用するためにどのような設定が必要なのか？
* 設定するとどう動くのか？

を見てみたい！と思いまして、無料のAzureアカウントを作成してみました！！！

レベル的にActive Directoryとか大丈夫かよ。。。と不安でいっぱいです。
windows2003serverの時にMCP70-294取ったけど、それ以降触りもしなければ見てもいません。
つか、MCP70-294って....2003serverって...

と、とりあえず頑張ります！щ(ﾟДﾟщ)
S！S！O！（エイエイオー的なノリで読んでください）


## SSOについてLINE WORKSのドキュメントを確認してみる
SSO(シングルサインオン)ということは聞いたことがあるのですが、実際にどのように設定されていれば正常に動くのか？などは全く理解していません。

まずLINE WORKSの[SSOに関するドキュメント](https://developers.worksmobile.com/jp/document/3001001?lang=ja)を参照しました。

Azure Active Directory側の設定画面については後述しますが、Azure Active Directory側はSAMLを使用するため、[SAML 2.0 による SSO
](https://developers.worksmobile.com/jp/document/1001070201?lang=ja)で全体の流れを確認しました。

最初にフローが書いてあるので流れはつかみやすいかと思います。

![LW06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/c39a6464-f6b8-931d-91bf-7434fd3a0b72.png)

その他のドキュメントにも目を通しました。
すべてを理解するのは難しいものの、気になったのは[SAML Response生成](https://developers.worksmobile.com/jp/document/10010804?lang=ja)です。

>Subject NameID	ログインした LINE WORKS ユーザーの ExternalKey

とありました。
 **Azure Active Directory側のユーザーとLINE WORKS側のユーザーを紐づけるために、<font color=red>LINE WORKS側ではユーザーのExternal Keyを使用する** </font>と言う事ですね。

LINE WORKS API2.0からユーザー登録時にExternal Keyは必須ではなくなりました。
ですが、 **SSOを構成する場合はユーザー情報にExternal Keyの登録が必須** ということですね。

では、Azure Active Directory側でLINE WORKSのユーザーのExternal Keyと対になる情報は何か？という点ですが、それは[後述](https://qiita.com/drafts#azure-active-directory%E5%81%B4%E3%81%AE%E3%81%A9%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%8Cline-works%E3%81%AEexternal-key%E3%81%A8%E9%96%A2%E9%80%A3%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B)します。


## Azure Active Directory
フリーアカウントの作成方法はいろんな方がWebで書いてるので割愛しますm(_ _)m

大がかりな検証は考えていないので、まずは1ユーザーで設定してちゃんと動くかを見たいと思います。

Azure Active DirectoryとLINE WORKSでSSOを設定するためのドキュメントが用意されていて、とっても助かる！と思ったんですが、まずドキュメントに記載されている画面の開き方すら分からない。。。

なので、設定経験のある方にアドバイスも頂きながら進めていきました！

### Azure Active DirectoryのエンタープライズアプリケーションにLINE WORKSを追加する
Azure Active Directory側の左側のメニューから「エンタープライズアプリケーション」を開きます。
![az01b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/b0bc312e-922b-c6b3-6939-b29dd4d0b7e5.png)

「＋新しいアプリケーション」をクリックします。
![az02b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/b9702d0d-603a-2aa6-231f-30ba9f612971.png)

検索ウィンドウにて「LINEWORKS」と入力すると、LINEWORKSが表示されますので、クリックします。
![az03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/3b7afaf2-ebc2-8a97-9405-44340ff6d768.png)

画面右側に以下のような画面が表示されますので、「作成」をクリックします。
※[LINE WORKS統合の手順に関するチュートリアル](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/worksmobile-tutorial)は絶対に開いておきましょう。

![az04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/c9499ae5-c5a0-00f0-09d5-313dc4b99aa8.png)

### シングルサインオンの設定
[LINE WORKS統合の手順に関するチュートリアル](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/worksmobile-tutorial)の流れで設定を進めます。
と言うか、このドキュメント見れば設定できるので、この投稿の意味あるの！？と思いますが、少なくとも私にとって意味があるということで。。。。設定を進めましょう。

エンタープライズアプリケーションに追加したLINE WORKSを開くと以下の画面が表示されますので、「シングルサインオンの設定」をクリックします。
![az05b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/73d0660e-53b7-09c7-ff3e-102d429e68e1.png)

LINE WORKSは「SAML」と「OAuth」が選択できますが、Azure Active DirectoryはSAMLのようなので、SAMLをクリックします。
![az12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/72c3dcf1-73d0-9334-0957-f6f796cb612c.png)

「①基本的なSAML構成」の「編集」をクリックします。
![az13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/d3802222-ec42-d89c-8b0c-5b317f70de62.png)


ドキュメントでは「サインオンURL」と「応答URL」の入力が必要と記載されていました。
それぞれ何を入力するかはドキュメントに書式が記載されています。
黒で塗りつぶしていますが、この部分には「LINE WORKSのドメイン名」を入力してください。
![az14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/4dd96604-5d95-4e8d-1c55-063fd4d01ecb.png)

「応答URL」の入力欄は初期状態では表示されていないので、「応答URLの追加」をクリックします。
入力する書式はドキュメントに記載があります。
サインオンURLと同様に塗りつぶしてある部分は「LINE WORKSのドメイン名」を入力します。
ここまで入力したら「保存」をクリックします。
![az15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/46a99ad1-b2e1-07a4-ebbf-5c200d4c2d2a.png)

「②属性とクレーム」の内容はとりあえず飛ばします。
「③SAML署名証明書」の「編集」をクリックします。
![az16b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/dc690c5c-b63d-2fcb-a2c1-79a963d503a1.png)

LINE WORKSでSAML SSOを設定する場合、PEM照明が必要です。
この画面でアクティブな証明書の「・・・」をクリックし、「PEM証明書のダウンロード」をクリックして、ファイルを保存してください。
![az17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/5b52fcd1-3093-d8dc-568f-4df0e9ecef05.png)


### ユーザー割り当て
こちらの[ドキュメント](https://docs.microsoft.com/ja-jp/learn/modules/create-users-and-groups-in-azure-active-directory/3-exercise-add-delete-users-azure-ad)を参考に、Azure Active Directory上にSSOテストユーザーを作成しました。
![az18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/38409f06-1088-f0bc-1560-cf9bcfdf2e5f.png)

「エンタープライズアプリケーション > LINE WORKS」を開き、「1.ユーザーとグループの割り当て」をクリックします。
![az05c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/f68a77ef-9ed4-49cc-0f15-f5e5556e3d4d.png)

「＋ユーザーまたはグループの追加」をクリックします。
![az06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/45179f3a-682a-7032-bbd8-ff6c8b74d9ff.png)

「ユーザー」の「選択されていません」をクリックします。
![az07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/eca59702-9de3-ee49-dd54-2e40cc51ba0b.png)

テストユーザーをクリックし、「選択」をクリックします。
![az08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/9f183408-4d07-b304-8c8b-b39e03fbbfcd.png)

「割り当て」をクリックし、ユーザーの割り当てが完了です。
![az10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/7747698b-43c4-b3bc-9b6e-df5af277e2a8.png)

### LINE WORKSのDeveloper Consoleの設定
次はLINE WORKS側の設定です。

Developer Consoleにログインし、画面左側の「SSO」をクリックします。
Azure Active DirectoryはSAMLに対応しているので、「SSO Type」はSAMLを選択します。
![lw01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/eb872472-f15d-e3fa-4440-e858465f5965.png)

必須項目は以下の3つです。
* Web Login URL
* Logout URL
* Certificate File

Certificate Fileは先ほどダウンロードしたPEM証明書のファイルをアップロードしてください。
Web Login URLとLogout URLはAzure Active Directoryからコピーしてきます。
![lw02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/6f9dfb87-cbb2-d2a5-7343-34a77d276de9.png)

Azure Active Directoryの「エンタープライズアプリケーション > LINE WORKS > シングルサインオンの設定 > ④LINE WORKSのセットアップ」にログインURLとログアウトURLの情報が表示されていますので、こちらをコピーしてDeveloper Consoleに貼り付けてください。
![az19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/34aec989-03bf-8280-5e17-6cf1cc5e5275.png)


Developer Consoleの各項目の設定が終わったら「適用」をクリックします。
※この時にLINE WORKSにログインしているメンバーは全員ログアウトされるので注意してください。
![lw03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/cf159d4c-83d7-366f-ded3-9b44efa2b335.png)

![lw04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/fd0ecd97-39db-0430-a6b6-1e45d8c27d9a.png)


### Azure Active Directory側のどの情報がLINE WORKSのExternal Keyと関連するのか？

* Azure Active Directory側
「エンタープライズアプリケーション > LINE WORKS > シングルサインオンの設定 > ②属性とクレーム」を参照します。

「一意のユーザーID」が関連付けに使用する情報となり、 **デフォルトは「user.userprincipalname」** です。
※「編集」に進むと、「一意のユーザーID」を変更する事が可能です。
![az20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/3fe17874-6739-5bf6-fe26-325367984e2b.png)

実際のユーザー情報で **「user.userprincipalname」がどの部分にあたるかというと、<font color=red>「ユーザープリンシパル名」**</font> です。
![az18b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/4c6b9a13-ec9e-abcc-78e8-85e5c04cebd0.png)

* LINE WORKS側
LINE WORKS側ではユーザーのExternal KeyがAzure Active Directoryのユーザー情報との関連付けに使用される項目です。
<font color=red> **Azure Active Directory側のユーザーのプリンシパル名を** </font>、 **関連付けたいLINE WORKSユーザーのExternal Keyに** 設定します。
![lw05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/2770ba60-0901-f4ea-1ff2-2f2acfe89561.png)

# 動作確認
* LINE WORKS側からのログイン
Microsoftアカウントでログインしていない状態で、LINE WORKSのログイン画面を開き、 **LINE WORKS側のID** を入力して、「はじめる」をクリックします。
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/9a331216-af40-ddf1-993e-738de316aad2.png)

Microsoftアカウントのログイン画面が表示されました。
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/03d33b3c-69ff-56ea-7e97-d3e703acfd3b.png)

 **Azure Active Directory側で作成したユーザーID** を入力して、「次へ」をクリックします。
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/eb0863b1-6395-0223-c785-f220fbb89446.png)

パスワードを入力して「サインイン」をクリックします。
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/241b6805-e3e1-2889-dea2-e8e3db9ef4e6.png)

LINE WORKSへ遷移し、正常にログインできました！
![az04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/7d28a038-713a-72d4-e399-2f8fd9d3baaf.png)


* Azure Active Directory側からのログイン
問題無いと思いますが念のため。

Microsoftアカウントのログイン画面に、 **Azure Active Directory側で作成したユーザーID** を入力して、「次へ」をクリックします。
パスワードも入力しサインインします。
![az01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/23fd369b-8372-e0ef-ac61-c06464e35d48.png)

Microsoftアカウントで正常にログインしました。
![az02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/618f574a-0d89-5fce-ea9c-499279c86eba.png)

LINE WORKSのブランドサイト上部から「ログイン」をクリックします。
![az03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/1279abd8-5d32-b294-06c1-ffa889e828a5.png)

LINE WORKS側のログイン画面が表示されることなく、正常にLINE WORKSのサービス画面が表示されました！
![az04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740500/9f75f3ad-2570-8a2c-901a-41e2006eb0f7.png)


# まとめ
* Azure Active DirectoryはSAMLでSSOを構成する
* Azure Active Directoryのユーザー情報とLINE WORKSのユーザー情報の関連付けは、
    * LINE WORKSは「ユーザーのExternal Key」
    * Azure Active Directoryは「②属性とクレーム」に表示されている「一意のユーザーID」（デフォルトは「user.userprincipalname」）
* LINE WORKSのドキュメント
[SSOの概要](https://developers.worksmobile.com/jp/document/3001001?lang=ja)
[SAML 2.0 による SSO](https://developers.worksmobile.com/jp/document/1001070201?lang=ja)
[SAML Response 生成](https://developers.worksmobile.com/jp/document/10010804?lang=ja)
[SAML Request の検証](https://developers.worksmobile.com/jp/document/10010802?lang=ja)
[SAML Response の署名に用いる証明書の登録](https://developers.worksmobile.com/jp/document/10010803?lang=ja)
* Azure Active Directory側のドキュメント
[チュートリアル: Azure Active Directory と LINE WORKS の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/worksmobile-tutorial)

今回はざっと設定を流した感じになりましたが、ゆくゆくは各設定について理解を深め、エラーを発生させる検証もしたいですね！