# 開発用の SAML セットアップ

## 経緯
以前までの[./旧: 開発用のSAMLサーバーセットアップ](https://dev.growi.org/632bf6fd4a0e56cdd8c249c0)の手順が使用できなくなっていた。
以前まで使用できていた jboss/keycloak の docker image が削除されてしまった新しく手順を作成する必要があった。

## 実装方法

### GROWI の設定

#### GROWI のセキュリティ設定から以下の設定を行う

- SAML を有効化する  
![image.png](/attachment/6672c2ce3e8aea45af9f00ac)

- 基本設定

    - エントリーポイント
        - http://localhost:18080/realms/growi/protocol/saml
    - 発行者
        - growi-client
    - 証明書
        - 後で設定します  

    ![image.png](/attachment/6672d0123e8aea45af9f349d)

- Mapping の設定  
![image.png](/attachment/6672c27b3e8aea45af9effc9)

### keycloak の立ち上げ


#### 1. 以下の docker-compose.yml を作成する


<details><summary>docker-compose.yml</summary>

```docker-compose.yml
version: "3"
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: password
    volumes:
      - mysql_data:/var/lib/mysql
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    environment:
      DB_VENDOR: mysql
      DB_ADDR: mysql
      DB_DATABASE: keycloak
      DB_USER: keycloak
      DB_PASSWORD: password
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password
    command: ["start-dev"]
    depends_on:
      - mysql
    ports:
      - "18080:8080"
volumes:
  mysql_data:

```

</details>

#### 2. docker compose up
以下コマンドで立ち上げる
```bash
docker compose up -d
```

### keycloak の設定
#### 1. http://localhost:18080/admin に接続する

- user: admin
- password: password

#### 2. relm を作成する

- 以下の Create realm 押下する  
![image.png](/attachment/667299aa3e8aea45af9e6ba0)

- Realm name に growi を入力して Create  
![image.png](/attachment/6672b1223e8aea45af9eafd0)

#### 3. Client の設定
- 左側のタブから Clients を押下し、import client を押下する  
![image.png](/attachment/6672b25d3e8aea45af9eb783)

- 以下の JSON 作成しアップロード後、Create を押下する

<details><summary>realm-client.json</summary>

```json
{
  "clientId": "growi-client",
  "rootUrl": "http://localhost:3000/",i
  "adminUrl": "http://localhost:3000/passport/saml/callback",
  "baseUrl": "http://localhost:3000/",
  "redirectUris": [
    "http://localhost:3000/*"
  ],
  "webOrigins": [
    "http://localhost:3000"
  ],
  "frontchannelLogout": true,
  "protocol": "saml",
  "attributes": {
    "saml.assertion.signature": "true",
    "saml.encrypt": "false",
    "post.logout.redirect.uris": "http://localhost:3000/passport/saml/callback",
    "saml.server.signature": "true",
    "saml.server.signature.keyinfo.ext": "false",
    "saml.signing.certificate": "MIICpzCCAY8CBgGQL8JlPzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxncm93aS1jbGllbnQwHhcNMjQwNjE5MDkwODA3WhcNMzQwNjE5MDkwOTQ3WjAXMRUwEwYDVQQDDAxncm93aS1jbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4+7l1AKkg/g2kt4H+iLkGRB+JaeoxvLu+XNox8pmWVyxgP5PKXPmhCOFc8kqCgDqsbtY8SpsKfqa+82vPeck2UESSp2a3mrI/3341eUpFeeSiUzk9fXX2eG8X3Q4U70lqww5jmUDjRkkipHloSxinMo2Ik3NqLU6c0SZGKSCQwm2MbePEuPy0JPbpsjioAVAEoAAmguknLUUKcVs2ZbhQe2f7YJJf7eRnh8Lro4fgtOGpmxtKa9DYzqT6Z9EMiJzpEQ5B1FHL1A1o94k2QgZ0bTggZj9ccN1NYxbTHDrEgmjsbcgRusNv293glwmvwLWefs2vCl5h0FGgHyIlMOn5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAXpqlLH1rI+qKTFkr6msDJWHZ9epmr32KfbUukVPjy3s4oxCDTQ0S5jlY2n5/GiAMLvCWZWhq2xCKTOkCvCwS8J68luj/VKXexxyPikA+9X7lsZaWUNfQavkrqS81FumkC/daHFO5j/C74vZXKRjIwfgvaDIx36R+T+w2G6Je9FOwdW48AZqB33yd8i9D90xV19bnMapesW+tYoPKrlhsbLn/je8ylVuwuZwO6HoJysEHasET3a67Zc1nO3NvdFWELXMHRg7LnTW2ppzD6xtBM39+F0xkiZAPqr8gQjul3/04IX4SAN/5wqJs5cc4TMlLnxaPQUA6J5Mmrc/W6NQYw=",
    "saml.signature.algorithm": "RSA_SHA256",
    "saml.client.signature": "false",
    "display.on.consent.screen": "false",
    "saml_name_id_format": "username",
    "saml.signing.private.key": "MIIEpAIBAAKCAQEAuPu5dQCpIP4NpLeB/oi5BkQfiWnqMby7vlzaMfKZllcsYD+Tylz5oQjhXPJKgoA6rG7WPEqbCn6mvvNrz3nJNlBEkqdmt5qyP99+NXlKRXnkolM5PX119nhvF90OFO9JasMOY5lA40ZJIqR5aEsYpzKNiJNzai1OnNEmRikgkMJtjG3jxLj8tCT26bI4qAFQBKAAJoLpJy1FCnFbNmW4UHtn+2CSX+3kZ4fC66OH4LThqZsbSmvQ2M6k+mfRDIic6REOQdRRy9QNaPeJNkIGdG04IGY/XHDdTWMW0xw6xIJo7G3IEbrDb9vd4JcJr8C1nn7NrwpeYdBRoB8iJTDp+QIDAQABAoIBABGWqra5qDspONQgeDFi39/dBpge3FwcD0hdhQgignDBa2hf5y4iusARa3c2WPgRV/LZC5D6QYVlDzcBB29X67Y4udptZRaAVKI+3n3YYWPbgA4gpmTGuvqDT0HYPIxoR6VpdELrWZh6kH3lIF+Wo1qTc5Jovby639qIhvB9HNnynvZLZr4CXS8Jfj06ZiT6NLPdArTuvr2Er3QLjA1ka26nkRoUjZRKhJPF07uYxZoRz1ftLMn6uvQtdINQZeSSVq1rOjHPS4sNyEk24tx8ElW/FBBoLiRZMmZVAxc62OVuyXB9X3yyHfe9ED6DBpGw/9OSUCxERjsopsF6SnY0PMECgYEA9zwfc9lHcTWRFp1XqMsGqGikIWOpSAv4zNIDePu2IIW53nUJYFuGi/v6X7q3/OWtvU4R8fXiUfkOjPTaVAkhq37fpLqzz209SNfiiWSZeay1+hvSQn0HutmGhIcNLqiGwgv3msM/ctV2LRk2l4+5622VCU0do9i3y2T554B4s8ECgYEAv4qc9FehNo+DAXADRF0plYEolzP4+SaGtnDItoPQU9K/H5PRzfESBxnWkLf7xxc2zRv8U8HDopa1pVwfRWYyIwGR/LmChxcD3mmv6wLKZNMepj1NiNgv0c0sXKIuLB3NvLtHi1N1av6GKrqZay2rD/I0ksRe4vP/Qcw90xR55DkCgYAV/k01+xA16/P6NQkFRPpUpOpk5f67IAWEAvK4InwzLHI6beLlpX60mTfOqEeRwcTQ4E8MXTlC3YsD0wxRCXbrUKAIgWtZenhHMJ1AZ6iXgFu34h20OHclkhA7XeA4VFmYjYP7Sn8scfzPSjznAqwhW2A0sZ1/Y9oFx/fLNkyGgQKBgQCPv1dLiPhUGiAXVBkflUtACE6OK1MOqPswsDPxxbrzLZaB/E3YYLNG4P1GXs11/NYD2JzlvuUzgCeSkjBlxOybmPIW2KI8/+jHYknD9bQvNsIpwJgPuy8oJPLGEnDUawmcOnDW/yt/wMSwDJpW9U8MCJmsC/OqH7PRjZZYc2WHAQKBgQCJejkkWh1BwYEozwGGG1iK9Me0gbOPxzi9QpFseExA3QDksxElUZ1e3VIsWTiy2CvAB13JvcI+Q096kEhJgvebm0a2vL0lJR5ff2ocZsrJA16XYvuid7WiEQcBh4a67ya0Dtyhehg+/fYbhud980nvdPedbDm4iczhUGC/XPWFWw==",
    "saml_signature_canonicalization_method": "http://www.w3.org/2001/10/xml-exc-c14n#",
    "saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer": "NONE"
  },
  "protocolMappers": [
    {
      "name": "uid",
      "protocol": "saml",
      "protocolMapper": "saml-user-property-mapper",
      "consentRequired": false,
      "config": {
        "attribute.nameformat": "Basic",
        "user.attribute": "username",
        "friendly.name": "uid",
        "attribute.name": "uid"
      }
    },
    {
      "name": "lastname",
      "protocol": "saml",
      "protocolMapper": "saml-user-property-mapper",
      "consentRequired": false,
      "config": {
        "attribute.nameformat": "Basic",
        "user.attribute": "lastName",
        "friendly.name": "lastname",
        "attribute.name": "lastname"
      }
    },
    {
      "name": "id",
      "protocol": "saml",
      "protocolMapper": "saml-user-property-mapper",
      "consentRequired": false,
      "config": {
        "attribute.nameformat": "Basic",
        "user.attribute": "id",
        "friendly.name": "id",
        "attribute.name": "id"
      }
    },
    {
      "name": "email",
      "protocol": "saml",
      "protocolMapper": "saml-user-property-mapper",
      "consentRequired": false,
      "config": {
        "attribute.nameformat": "Basic",
        "user.attribute": "email",
        "friendly.name": "email",
        "attribute.name": "email"
      }
    },
    {
      "name": "firstname",
      "protocol": "saml",
      "protocolMapper": "saml-user-property-mapper",
      "consentRequired": false,
      "config": {
        "attribute.nameformat": "Basic",
        "user.attribute": "firstName",
        "friendly.name": "firstname",
        "attribute.name": "firstname"
      }
    }
  ],
  "defaultClientScopes": [
    "role_list"
  ],
  "optionalClientScopes": [],
  "access": {
    "view": true,
    "configure": true,
    "manage": true
  }
}

```

</details>

- 以下のような感じ

![image.png](/attachment/6672b3233e8aea45af9eba9e)

#### 4. User 作成

- 左側のタブから、Users を押下し、Create new user を押下する

![image.png](/attachment/6672b5813e8aea45af9ec336)

- 以下のように入力、選択後、 Create を押下する
![image.png](/attachment/6672b6383e8aea45af9ec520)

- Credentials のタブから、Set password を押下し、以下のように入力する。  
![image.png](/attachment/6672c1b43e8aea45af9efcd4)

#### 5. 証明書の設定

<a href=https://dev.growi.org/66728d633e8aea45af9e3f4a#growi-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A%E3%81%8B%E3%82%89%E4%BB%A5%E4%B8%8B%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86>ここ</a>で飛ばした証明書の設定を行う

- GROWI のセキュリティ設定から以下の設定を行う

    - keycloak の左のタブ内 Relms settings から RSA256 と書かれた Certificate を選択

    ![image.png](/attachment/6672ccc13e8aea45af9f2867)
    - 表示された証明書を GROWI 側に入力する

### ログイン

/login のページで SAML をクリック後、上で作成した user でログインできることを確認できれば完了です 



---

## Page Navigation

- Canonical URL: https://dev.growi.org/Tips/開発用のミドルウェア追加/SAMLサーバー
- Permalink: https://dev.growi.org/66728d633e8aea45af9e3f4a
- Parent: [開発用のミドルウェア追加](/67987af3bb46ee518ff516cb.md)
- Children: 1 total
  - [旧: 開発用のSAMLサーバーセットアップ](/632bf6fd4a0e56cdd8c249c0.md)
- Total descendants: 1
- Siblings: 10 total
  - [Basic 認証サーバー](/63992fd7d7536a53de4969a4.md)
  - [LDAPサーバー](/629dd4d92ac5066b1efe3693.md)
  - [OGPサーバー(暫定)](/6139c17cd5f8360051fd7f67.md)
  - [OpenTelemetry Collector](/6799e77ebb46ee518ff92fee.md)
  - [SMTP サーバー (Gmail)](/657fdfa5f9081252aeb733e2.md)
  - [SMTPサーバー (ローカル環境&ローカル環境以外)](/5f16c165ec75070048deecd6.md)
  - [SlackBot-with-Proxy 開発用のMySQLサーバーセットアップ](/60671e9dbe2e6f004994f686.md)
  - [Slackbot (en)](/617fc483038d9b4646271961.md)
  - [Slackbot (ja)](/6018f802f675a60048a6135d.md)
  - [nchanサーバー](/5f16c6d5ec75070048deecdb.md)
- Last updated: 2025-01-28T06:37:59.990Z by yuki
- Full page listing (all children regardless of count): https://dev.growi.org/_api/v3/page-listing/children?id=66728d633e8aea45af9e3f4a
