Windowsでpython3-samlを使ってSAMLベースSSOを試してみた

## はじめに

Windows環境で、SAMLベースSSO(シングルサインオン)を試してみました。
SP(サービスプロバイダ)として、Pythonライブラリpython3-samlを使用、
IdP(IDプロバイダ)として、Azure AD(Active Directory)を使用しました。

## Azure Active Directory(Azure AD)とは

- クラウドベースのIDおよびアクセス管理サービス
- Microsoft 365/Azure portal/その他SaaSアプリ、など外部リソースへのアクセスを支援
- イントラネットネットワーク上のアプリなど内部リソースと、組織向けクラウドアプリへのアクセスを支援

## [python3-saml](https://github.com/onelogin/python3-saml)とは

- SAML認証のPython3ツールキット
- PythonソフトウェアでSAML認証機能を実装する場合使用

## 検証開始

### Azure ADにアプリを登録し、SAMLベースのSSOをセットアップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/4c00729d-c991-65ef-e2a2-c13e97958407.png)

![スクリーンショット 2022-07-19 091643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/d20c0679-0aad-8366-4b18-f91a09ceb7ef.png)

### Windows環境にpython3-samlをインストールし、起動

### 検証環境

- OS: Windows 10
- pyenv

### python3-samlを入手

```
git clone https://github.com/onelogin/python3-saml.git
```

### SAML設定

`python3-saml\demo-flask\saml\settings.json`設定ファイルを編集
```
{
    "strict": true,
    "debug": true,
    "sp": {
        "entityId": "https://localhost:5000/metadata/",
        "assertionConsumerService": {
            "url": "https://localhost:5000/?acs",
            "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
        },
        "singleLogoutService": {
            "url": "https://localhost:5000/?sls",
            "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
        },
        "NameIDFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified",
        "x509cert": "",
        "privateKey": ""
    },
    "idp": {
        "entityId": "<AzureAD EntityID >",
        "singleSignOnService": {
            "url": "<AzureAD SSO Service >",
            "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
        },
        "singleLogoutService": {
            "url": "<AzureAD SingleLogout Service String >",
            "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
        },
        "x509cert": " <AzureAD_X509_String> "
    }
}
```

### Python3.6をインストール

```
pyenv install 3.6.8
pyenv local 3.6.8
pyenv version
3.6.8
```

### 依存ライブラリをインストール

python3-samlのdemo-flaskアプリをSPとして使用します。

```
cd python3-saml
cd demo-flask
pip install python3-saml
pip install flask==1.1.4
```

## アプリ実行

- `Let's Encrypt`などを使用し、SSL証明書を作成
    - `fullchain.pem`、`privkey.pem`を`python3-saml\demo-flask`に配置。

- アプリ起動
```
set FLASK_APP=index.py
flask run --host localhost --cert fullchain.pem --key privkey.pem
 * Serving Flask app "index.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on https://localhost:5000/ (Press CTRL+C to quit)
```

## ブラウザから`https://localhost:5000`にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/5f2c0ce8-6ac3-10af-5845-1be787273eff.png)

Logonボタンをクリックすると、SAMLベースのSSO認証が行われる

![スクリーンショット 2022-07-19 091504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/92598dac-b563-d0c7-bd2f-662f8f6223e9.png)

## おわりに

Windows環境で、python3-samlを検証してみました。
SAMLベースSSO検証の一助になれば何よりです。