Microsoft Entra ID（旧AzureAD）を使ってNextcloudのSAML認証（シングルサインオン）してみる

## はじめに；AzureとNextcloud：SAMLとSSO設定-全体図
（拡大してご利用ください）
![AzureとNextcloud_SAMLとSSO設定-全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/f4a9cd83-ebf8-5f94-1609-8385e9a1c8ba.png)

- 各項目の番号と同じ項目名は、それぞれ参照元（コピー元）と参照先（ペースト先）です。
- ※以降、それぞれの項目の操作などを説明します。

【利用環境】
- Nextcloud 25.0.13　※PHP7.4最終バージョン
  - SSO & SAML authentication 5.2.7
- さくらのレンタル（ビジネス）PHP7.4

【運用について】
- 利用者はNextcloudにSSOでログインする。
  - Nextcloudに登録されていないユーザーはログイン後に自動生成される。
- 管理者はNextcloudのローカルユーザーで作成しておいて、次のURLでログインする。  
 ```https://{構築したNextcloudのURL}/index.php/login?direct=1``` 


## 1. Azure - Microsoft Entra ID の設定
### 1.1. エンタープライズアプリケーション - 独自のアプリケーションを作成
　Azureコンソール画面（ https://portal.azure.com/ ）の【エンタープライズアプリケーション > Microsoft Entra ギャラリーを参照する】にて独自のアプリケーションを作成します。

- （１）[Microsoft Entra ID]を選択。
    <details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/e7213e41-018a-ac6b-0133-aeeeb55b80d3.png"></details>
<p/>

- （２）[エンタープライズアプリケーション]を選択。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/a43ed25b-b60e-c6c2-8588-1b22d98c8f13.png"></details>
<p/>

- （３）[＋ 新しいアプリケーション]をクリック。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/8389f176-4c35-334e-e444-f42a32058d09.png"></details>
<p/>

- （４）[＋ 独自のアプリケーションの作成]をクリック。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/170186f0-5678-5d36-0644-d75c92cdce33.png"></details>
<p/>

- （５）独自のアプリケーションの作成項目を入力し、[作成]ボタンを押す。
    <details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/3431dc67-8533-4db9-a287-79d6a7ec8c69.png"></details>

  - 任意のアプリ名を付ける（例：nextcloud-sso）
  - [ギャラリーに見つからないその他アプリケーションを統合します（ギャラリー以外）]にチェックする。
  - [作成]ボタンを押す。


### 1.2. エンタープライズアプリケーション - ユーザの登録
　シングルサインオン（SSO）させるユーザを登録します。

- （１）作成したアプリの概要画面で[ユーザとグループの割り当て]ボタンを押す。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/4c8ee3a3-6f10-a843-0750-e2fb6a506b73.png"></details>
<p/>

- （２）[＋ ユーザーまたはグループの追加]をクリック。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/6750aec5-17bb-fe9f-4134-63070e7ba680.png"></details>

    :::note warn
	Active DirectoryプランレベルがFreeの場合グループを割り当てることが出来ず、  
	個々のユーザを選択していく作業になります。
<p/>

- （３）ユーザー項目の[選択されていません]リンクをクリック。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/1896f4a5-7800-fce8-c9dc-021270711172.png"></details>
<p/>


- （４）ユーザーを選択（複数または単独）し[追加]ボタンを押す。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/83f140d6-a991-15f0-7e0b-998a26f5726d.png"></details>
<p/>

- （５）割り当ての追加画面で[割り当て]ボタンを押す。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/7ad5f644-4fc9-72e7-2f0b-b2a21845c765.png"></details>
<p/>

- （６）「ユーザーとグループ]に割り当てたユーザーが確認できる。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/88ca2977-9ef6-a14f-81d6-47b6769cde36.png"></details>
<p/>

### 1.3.  エンタープライズアプリケーション - SSO（SAMLベース）の設定
　Nextcloudへ登録するIDPの値の取得およびNextcloudのエンティティID、応答URLを入力します。

- （１）[シングルサインオン] - [SAML]ボタンを選択。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/a2311d3c-cad1-b9ba-1011-cb8b375db153.png"></details>
<p/>

- （２）[基本的なSAML設定]の[編集]ボタンを押す。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/d3673f9b-79f3-688a-0046-f73b9c620649.png"></details>
<p/>

- （３）[基本的なSAML設定]の編集画面で次の様に入力する。
  - ⑤識別子（エンティティID）  
 ```https://{構築したNextcloudのURL}/index.php/apps/user_saml/saml/metadata```
  - ⑥応答URL  
 ```https://{構築したNextcloudのURL}/index.php/apps/user_saml/saml/acs```  ```（インデックス）1```
 	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/d4425688-93ff-f8b6-4c8d-6593fbe6a790.png"></details>

    :::note warn
	Nextcloudのバージョン違いによって登録するURLが異なる場合があるそうです。  
	正確なパラメータは、Nextcloudのアプリ「SSOとSAML認証」設定の「メタデータXMLのダウンロード」で取得できます。  
	（従ってこのパラメータはNextcloudの設定後、後から上書きする場合もあります。）  
<p/>

- （４）[属性とクレーム]の[編集]ボタンを押し、次のUIDが登録されているか確認する。
  - ①クレーム名（[必要な要求]または[追加の要求]いずれかの項目）   
 
```http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress```

 ```http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name```
  	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/4a7e4578-8280-8125-a02e-ab91c59668db.png"></details>

	:::note warn
	UIDのマップする属性に「emailaddress」を採用するのは次の情報
によります。
だったのですが、、
	(Github：nextcloud/user_saml)[o365 External Guests Cannot Access Shares. #637](https://github.com/nextcloud/user_saml/issues/637#issuecomment-1282352634)
 結局「name」の方を使わないとプロビジョニングエラーになってしまいました。
<p/>

- （５）[SAML証明書]の[証明書(Base64)]をダウンロードしておく。
  - ④証明書(Base64)
	<details><summary>操作画面</summary>
	<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/70efc70c-4db4-7040-e6ab-66bbdd2f8baa.png">
	<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/b8eb0956-56e8-fda1-7f26-901091a248ad.png">
	</details>
<p/>

- （６）[（アプリ名 例:nextcloud-sso）のセットアップ]の次の項目をコピーする。
  - ②ログインURL
  - ③Microsoft Entra 識別子
  	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/9392e91a-6203-daa5-0454-4cc836ed07c7.png"></details>
<p/>

## 2. Nextcloud - SSOとSAML認証アプリの設定
### 2.1. 「SSO & SAML authentication」アプリをインストール
　Nextcloudの[管理者設定] - [アプリ]に移動して実施します。
- <details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/809f9c52-d8ba-e232-4598-e1159bfcc4f5.png"></details>
<p/>

### 2.2. 「SSO & SAML authentication」(SSOとSAML認証) アプリの設定
　Nextcloudの[管理者設定] - [SSOとSAML認証]に移動して設定します。

- （１）[組み込みのSAML認証を使用する]ボタンを押して初期化する。
	<details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/36defb70-40e7-2a95-5e7c-ec318f1583f4.png"></details>
<p/>

- （２）[グローバル設定]を運用に合わせて選択する。
    <details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/cdb8dee4-8516-4666-a8df-1fc71cbdbbf2.png"></details>

  - 今回は「（Nextcloud表示名）デスクトップクライアントにSAML認証を使用する（ユーザーの再認証が必要）」だけチェックをする。
  - 管理者アカウントはSSOを使わず、Nextcloudに個別に登録しておいて、  
 次のURLでログインする運用とする。  
 ```https://{構築したNextcloudのURL}/index.php/login?direct=1``` 

	:::note info
 	「複数のユーザーのバックエンド（LDAPなど）の使用を許可する」にもチェックをすると、  
 	ログイン操作時に[ダイレクトログイン]と[（SSO&SAMLログイン）]ボタンが並んで表示するが、  
 	利用者が誤ってダイレクトログインを選択する可能性がある。
 	従って、利用者にはSSOログインしか使わせたくない場合は今回の設定が適切と思われる。
<p/>

- （３）[一般]の[UIDをマップする属性。]欄にクレーム名を入力する。  
	①クレーム名  
	```http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name```  
	<details><summary>操作画面</summary>
	<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/300e0601-4dea-4c89-a713-1d06de9844ce.png">
	<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/28d7d42f-a8e3-bb46-4d3f-bc0d85df95e8.png">
	</details>
 
	※[IDプロバイダーのオプション表示名（デフォルト："SSO&SAMLログイン"）]欄は任意で入力。 
 （「複数のユーザーのバックエンド（LDAPなど）の使用を許可する」にもチェックが入っている時に利用者に表示されるボタン名になる。）
<p/>

- （４）[Identity Providerデータ]の各欄に入力する。

  <details><summary>操作画面</summary>
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/5cd19e1b-3804-9899-cfb1-79d63b88d068.png">
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/f8baa96f-e968-a1bd-f235-bd9862ded79c.png">
</details>
&nbsp;&nbsp;&nbsp;&nbsp;
<table><thead>
  <tr>
    <th>欄（プレースホルダー）</th>
    <th>入力する値</th>
  </tr></thead>
<tbody>
  <tr>
    <td>IdPエンティティの識別子（URIでなければならない）</td>
    <td>③Microsoft Entra 識別子</td>
  </tr>
  <tr>
    <td>SPが認証要求メッセージを送信するIdPのURLターゲット</td>
    <td>②ログインURL</td>
  </tr>
  <tr>
    <td>URL SPがSLO要求を送信するIdPの場所</td>
    <td>②ログインURL</td>
  </tr>
  <tr>
    <td>IDPがSLOレスポンスを提供するURL</td>
    <td>（空欄のまま）</td>
  </tr>
  <tr>
    <td>IdPの公開X.509証明書</td>
    <td>④証明書(Base64)</td>
  </tr>
</tbody>
</table>

- :::note info
    Azureからダウンロードした「④証明書(Base64)」はテキストエディタで開いて  
    該当欄にコピペします。
    <div>
    <details><summary>操作の様子</summary>
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/36ed55c2-ff10-fddb-3a45-84cefc22e242.gif">
    </detail>
    </div>

<p/>

- （５）[属性マッピング]の必要欄を入力する。
    ①クレーム名
    ```http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name```
    ※これによりユーザーのメールアドレスが自動登録される。
    <details><summary>操作画面</summary><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/dfff536d-f016-0aa0-b479-32b03fe18eab.png">
</details>
&nbsp;&nbsp;&nbsp;&nbsp;
<table><thead>
  <tr>
    <th>欄（プレースホルダー）</th>
    <th>入力する値</th>
  </tr></thead>
<tbody>
  <tr>
    <td>表示名をマップする属性。</td>
    <td>（空欄のまま）</td>
  </tr>
  <tr>
    <td>電子メールアドレスをマップする属性。</td>
    <td>①クレーム名</td>
  </tr>
  <tr>
    <td>クオータをマップする属性。</td>
    <td>（空欄のまま）</td>
  </tr>
  <tr>
    <td>ユーザーグループをマップする属性。</td>
    <td>（空欄のまま）</td>
  </tr>
  <tr>
    <td>ユーザーをホームにマップするための属性。</td>
    <td>（空欄のまま）</td>
  </tr>
  <tr>
    <td>Attribute map the users MFA login status</td>
    <td>（空欄のまま）</td>
  </tr>
</tbody>
</table>

## 3. NextcloudにSSOログインを試してみる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/cc76cc31-6e47-e462-5341-bba4ac39d3d0.gif">
成功しました。


## 参考URLなど

- (SoftBank クラウドテクノロジーブログ様) [Azure Active Directoryを使って NextcloudのSAML認証をしてみた ※ 構築手順付き](https://www.softbank.jp/biz/blog/cloud-technology/articles/202208/azure-ad-smal-nextcloud/)

- (GitHub) [HOWTO Nextcloud SAML Login with AzureAD.md](https://gist.github.com/realslacker/7a8d79755f706aae76175df9c27b797d)

- (Abillyz様) [AzureADを利用してNextcloudのSAML認証をやってみる](https://abillyz.com/mamezou/studies/751)

- (SingleID Document) [NextcloudのSAML認証設定](https://pubdocs.singleid.jp/singleid-appguide/nextcloud/#nextcloud%E3%81%AEsaml%E8%AA%8D%E8%A8%BC%E8%A8%AD%E5%AE%9A)

<br>
・・・そして自分自身の試行錯誤。

- (Qiita Q&A) [【解決】「Nextcloud」(25)：SSO設定してみたがプロビジョニングされていないエラーでログイン出来ない](https://qiita.com/hiro-matsumoto/questions/aec57f77df3608039ed4)


以上です。