🐁

ZITADEL を IdP として Go で SAML SP を実装する

2024/10/27に公開

はじめに

SSO を実装する選択肢として SAML という規格があります。
SAML は Microfoft Entra IDokta を導入する企業と連携する上で選択肢として挙げられます。
これらの環境を実際に用意して連携するのもよいですが気軽にはできません。

そこで ZITADEL という OSS のアプリケーションを用いてもっと気軽に連携できる環境を作りたいなと思い構築してみたのでその共有です。

SAML とは

ZITADEL に記載があったので参考リンクとして載せておきます。

https://zitadel.com/docs/guides/integrate/login/saml

ZITADEL とは

認証管理を行うための OSS のアプリケーションです。

https://zitadel.com/

コードも GitHub にて管理されています。

https://github.com/zitadel/zitadel

ZITADEL を構築

以下の公式ドキュメントに従って docker compose を実装すればローカル環境にて zitadel を構築できます。

https://zitadel.com/docs/self-hosting/manage/configure

admin ユーザーでログインしやすくするためにちょっと環境変数をいじったり PostgreSQL を使ったりしたかったので私は以下のように compose.yaml ファイルを記載しています。

https://github.com/otakakot/sample-go-saml-feat-zitadel/blob/main/compose.yml

ローカル環境のイメージとしては以下のようになります。

リダイレクトさせる兼ね合いで app は docker ネットワーク外にて構築してます。

Go で SP を実装

Go で SAML SP を実装するために以下のライブラリを使います。

https://github.com/crewjam/saml

README に記載があるのでそれに従って実装するだけです。

https://github.com/crewjam/saml/blob/main/README.md#getting-started-as-a-service-provider

openssl コマンドを利用している箇所がありますが、こちらを省略するために Go で証明書の実装を行いその値を利用します。

https://github.com/otakakot/sample-go-saml-feat-zitadel/blob/main/main.go#L118-L158

IdP Metadata URL は以下を設定します。

http://localhost:8080/saml/v2/metadata

連携作業

SAML にて SSO をするために自分が開発したアプリケーション (SP) と ZITADEL (IdP) を連携します。

手動編

  1. localhost:8080 に 管理者アカウントでログイン
  2. Projects タブを選択
  3. Create New Project を選択
  4. Project 名を設定
  5. APPLICATIONS を追加
  6. SAML Applications を選択
  7. http://localhost:7070/saml/metadata にアクセスして metadata をダウンロード
  8. metadata.xml にファイル名を変更し Upload XML file にてアップロード
  9. Create にてアプリケーションを作成
  10. 以下のような画面にてアプリケーションが作成されたことを確認
  11. 以上の設定が完了したら http://localhost:7070 にアクセス
  12. ログイン済みであればリダイレクトしサーバーへアクセスが可能
  13. 未ログインであればログイン画面へと遷移

自動編

手動で登録するのもそこまで手間ではないですがせっかくならば自動で行いたいものです。
ZITADEL は zitadel-go というクライアント用のライブラリも用意されています。

https://github.com/zitadel/zitadel-go

こちらを利用して手動にて登録していた情報を Go コードにて登録します。
API Reference は以下にあります。(が、Go のコードを漁った方が早いです...)

https://zitadel.com/docs/apis/introduction

実装した自動化のための実装は以下になります。

https://github.com/otakakot/sample-go-saml-feat-zitadel/blob/main/internal/zitadelx/zitadel.go

これをコマンドラインの実装から呼び出し
(もうちょっと頑張れば SP サーバー起動時に仕込めるかもしれませんが一旦 CLI にて実装です。)

コマンドを実行すれば手動編にて設定した情報と同じものが設定されます。
こちらも http://localhost:7070 にアクセスして動作を確認することができます。

おわりに

ZITADEL を使えばローカル環境でも IdP を構築でき自動化も簡単にできたので自動テストなども構築できるかと思います!

今回実装したコードは以下に置いておきます。バージョン情報などは以下のリポジトリをご確認ください。

https://github.com/otakakot/sample-go-saml-feat-zitadel

Discussion