Keycloak(Quarkus distribution)を用いてGrowiへのログイン認証

株式会社 Vitalizeで webエンジニアをしている @nagaemon です。
現在は長野の支社にお世話になっており、現在はエンジニア + 地方創生事業に携わっています。
好きな言語はrubyです。

今回はGrowiとSAML認証を用いて連携の方法と、その際に詰まった
ポイントを残しておこうと思います。

## Growiとは
https://growi.org/ja/
GROWIは、MITライセンスで公開されているオープンソースのウィキソフトウェアである。 
日本のエンジニアによって開発されていることで有名です。
また、SAMLやLDAP認証、外部のOAuthプロバイダを利用したログインをサポートしている点が特徴に挙げられます。

## ログイン実装
今回は
こちらのGrowi Keycloak　間でのSAMLを用いてのログインを実装していこうと思います。ほとんどはこちらのGROWI Developers Wikiの[開発用のSAMLサーバーセットアップ](https://dev.growi.org/632bf6fd4a0e56cdd8c249c0)を参考にしました。

ただ、こちらで使われているkeycloakイメージはjboss/keycloakとなっており、
quay.io/keycloak/keycloakのイメージで立ち上げた場合と差分があったので、メモに残しました。
## Growiの設定
立ち上げはこちらのGrowi Docsを参考に立ち上げました。
https://docs.growi.org/ja/admin-guide/getting-started/docker-compose.html#growi-%E3%81%AE%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A%E3%82%AF%E3%82%99%E3%83%AC%E3%83%BC%E3%83%88%E3%82%99

admin権限でログイン後はサイドバー左下の歯車アイコンからwiki管理TOPへ行くので、そこからさらにセキュリティ設定へ 
もしくはhttp://localhost:3000/admin/security から直接遷移できます。
![スクリーンショット 2023-08-17 10.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/22eaf771-d4f6-322e-0820-2e875ffab4b0.png)

下にスクロールすると認証機構設定があるので、そこで「SAML」を選択
SAMLを有効にした後に、コールバックURLをメモしておきましょう、Keycloak側で必要になります。
![スクリーンショット 2023-08-17 10.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/b28777c6-d475-1d6d-d2af-f7355a859747.png)

## Keycloakの設定
keycloak側の設定はこちらの本家のGetting start を参考に立ち上げます。https://www.keycloak.org/getting-started/getting-started-docker

### レルム　クライアントの作成

今回はレルムを[demo-realm]
クライアントを[growi-client]
として作成しました。

#### レルム側
Realm name: demo-realm
![スクリーンショット 2023-08-17 10.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/561f3b71-72ab-3082-bdd1-1db809ea666f.png)

#### クライアント側
### General Settings
Client type: saml
Client ID: growi-client

![スクリーンショット 2023-08-17 10.54.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/d9458a5e-ad99-04ad-96ae-9aea5b9428ea.png)

### Login settings
Root URL: http://localhost:3000/
Home URL: http://localhost:3000/
Valid redirect URIs: http://localhost:3000/*
Master SAML Processing URL: http://localhost:3000/passport/saml/callback (← Growi側でメモしたコールバックURL)

![スクリーンショット 2023-08-17 10.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/442c41ce-55cc-eb38-ca66-3390b7b681a4.png)

### クライアント設定
Client(クライアント一覧画面) → growi-client選択 → Settingタブ選択

### SAML capabilities
- Name ID format: username
- Force POST binding: ON
- Include AuthnStatement : ON
![スクリーンショット 2023-08-17 11.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/f1439ba0-08c6-d1f5-e379-910f85e67266.png)

### Signature and Encryption
- Sign documents: ON
- Sign assertions: ON
- Signature algorithm: RSA_SHA1
- SAML Signature Key Name : KEY_ID
- Canonicalization Method : EXCLUSIVE
![スクリーンショット 2023-08-17 11.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/1c52a3d4-c0e3-9af1-0aad-9a896af825fa.png)

### Logout settings
- Front channel logout: ON
![スクリーンショット 2023-08-17 11.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/de001209-c6d1-6f11-7283-ac4d7ecf0c3d.png)

### Keys設定
- Client signature required: OFF
    - ここはOFFにしておかないとSigAlg was nullというエラーが出続けます。
    - 参考 [Keycloak and Spring SAML: SigAlg was null](https://stackoverflow.com/questions/50619575/keycloak-and-spring-saml-sigalg-was-null)
![スクリーンショット 2023-08-17 11.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/00efb298-621f-7fdd-162c-c0728be9bed8.png)

### クライアントマッパーの設定
Keycloakのバージョンが１６以降はこのクライアントマッパーの位置が変更になっていたので、探すのに苦労しました。

場所は同ページのタブ「Client scope」選択後のxxxxx-dedicated(この場合はgrowi-client-dedicated)内にて設定可能
Mappersタブ内の Add apperを選択して追加する。

![スクリーンショット 2023-08-17 11.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/6f486d75-284f-3195-db41-8db4a4d89ad6.png)

Add mapper → By configuration → User Propertyの順に選択
![スクリーンショット 2023-08-17 11.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/4bc8efc9-a445-5730-e009-ffa80b583b50.png)

- id
- lastname
- firstname
- email
- mapper-username

idからemailまでの設定に関しては、「Name」、「Property」、「Friendly Name」、「SAML Attribute Name」は同名にする

![スクリーンショット 2023-08-17 11.31.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/f42ecf06-6013-f0d9-6586-5be467b63b9c.png)

mapper-usernameに関しては
- mapper-username
- Mapper Type: User Property
- Property: username
- Friendly Name: User's name
    - こちらは適当、わかりやすいものに設定
- SAML Attribute Name: uid

![スクリーンショット 2023-08-17 11.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/9fa48981-c606-9fb6-01f5-302d1dd4a994.png)

全て作成するとしたの図のようになる

![スクリーンショット 2023-08-17 11.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/c719307d-29f1-3731-e591-99094e10a4a8.png)

### keycloak側でのユーザー作成
- Username: test_user
- Email: test_user@example.com
- First name: test
- Last name: user
で作成

![スクリーンショット 2023-08-17 11.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/4239253a-2ac2-a150-f0cc-74ae49057daf.png)
作成後はCredentialsタブ→ Set passwordからユーザーのパスワードも設定しておきます。
- password & Password confirmation: 「任意のパスワード」
- Temporary: どちらでも良いですが、今回はOff
![スクリーンショット 2023-08-17 12.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/d5c0260e-5f6c-aa76-94d5-492fa6cc041a.png)

## Growi SAML設定
http://localhost:3000/admin/security
にて初めに設定した認証機構設定に移動できます。

keycloak側での設定した値を用いて、こちらも変更します。

### Basic Settings
- エントリーポイント: http://localhost:8080/realms/demo-realm/protocol/saml
    - keycloak内のconfigure(Realm settings)内のEndpointsのリンクを押下後のLocation以降の文字列を記述
![スクリーンショット 2023-08-17 11.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/805355d7-232f-4ad9-775c-f82f5f662a2e.png)

- 発行者: growi-client
- 証明書: 
    - Keycloak の管理画面にアクセス
    - Realm Settings の Keysタブをクリック
    - Algorithm RS256 の Certificate を copy & paste する
![スクリーンショット 2023-08-17 11.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/a2ba11f0-7de7-fce1-895f-d0fbfc8e7b91.png)
![スクリーンショット 2023-08-17 11.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/4f7a879a-57db-7494-51d3-635ba0015624.png)

### Attribute Mapping
- ID: id
- username: uid
- メールアドレス: email
を入力する

![スクリーンショット 2023-08-17 11.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/c13c0b06-e977-7e5d-4f20-33718953a2ec.png)


## ログイン確認

ログアウトもしくはhttp://localhost:3000/login にてログイン画面へ
External Auth で添付画像のようなログインボタンが表示されるはずです。
![スクリーンショット 2023-08-17 12.02.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/7a4c746a-c08c-1df2-5f46-0048b9ee89f5.png)

押下後にkeycloakのログイン画面へ、keycloak のユーザー登録したユーザー名(もしくはemail)とpasswordを入力
![スクリーンショット 2023-08-17 12.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/aa08045e-ad9e-27fd-80ac-a7783bc04044.png)


無事ログインできたら成功です！
![スクリーンショット 2023-08-17 12.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165799/db1972e4-4ce3-4588-1506-eefdc1b57757.png)