ZITADEL を IdP として Go で SAML SP を実装する
はじめに
SSO を実装する選択肢として SAML という規格があります。
SAML は Microfoft Entra ID や okta を導入する企業と連携する上で選択肢として挙げられます。
これらの環境を実際に用意して連携するのもよいですが気軽にはできません。
そこで ZITADEL という OSS のアプリケーションを用いてもっと気軽に連携できる環境を作りたいなと思い構築してみたのでその共有です。
SAML とは
ZITADEL に記載があったので参考リンクとして載せておきます。
ZITADEL とは
認証管理を行うための OSS のアプリケーションです。
コードも GitHub にて管理されています。
ZITADEL を構築
以下の公式ドキュメントに従って docker compose を実装すればローカル環境にて zitadel を構築できます。
admin ユーザーでログインしやすくするためにちょっと環境変数をいじったり PostgreSQL を使ったりしたかったので私は以下のように compose.yaml
ファイルを記載しています。
ローカル環境のイメージとしては以下のようになります。
リダイレクトさせる兼ね合いで app は docker ネットワーク外にて構築してます。
Go で SP を実装
Go で SAML SP を実装するために以下のライブラリを使います。
README に記載があるのでそれに従って実装するだけです。
openssl
コマンドを利用している箇所がありますが、こちらを省略するために Go で証明書の実装を行いその値を利用します。
IdP Metadata URL は以下を設定します。
http://localhost:8080/saml/v2/metadata
連携作業
SAML にて SSO をするために自分が開発したアプリケーション (SP) と ZITADEL (IdP) を連携します。
手動編
- localhost:8080 に 管理者アカウントでログイン
-
Projects
タブを選択 -
Create New Project
を選択
- Project 名を設定
- APPLICATIONS を追加
- SAML Applications を選択
-
http://localhost:7070/saml/metadata
にアクセスしてmetadata
をダウンロード -
metadata.xml
にファイル名を変更しUpload XML file
にてアップロード
-
Create
にてアプリケーションを作成
- 以下のような画面にてアプリケーションが作成されたことを確認
- 以上の設定が完了したら
http://localhost:7070
にアクセス - ログイン済みであればリダイレクトしサーバーへアクセスが可能
- 未ログインであればログイン画面へと遷移
自動編
手動で登録するのもそこまで手間ではないですがせっかくならば自動で行いたいものです。
ZITADEL は zitadel-go というクライアント用のライブラリも用意されています。
こちらを利用して手動にて登録していた情報を Go コードにて登録します。
API Reference は以下にあります。(が、Go のコードを漁った方が早いです...)
実装した自動化のための実装は以下になります。
これをコマンドラインの実装から呼び出し
(もうちょっと頑張れば SP サーバー起動時に仕込めるかもしれませんが一旦 CLI にて実装です。)
コマンドを実行すれば手動編にて設定した情報と同じものが設定されます。
こちらも http://localhost:7070
にアクセスして動作を確認することができます。
おわりに
ZITADEL を使えばローカル環境でも IdP を構築でき自動化も簡単にできたので自動テストなども構築できるかと思います!
今回実装したコードは以下に置いておきます。バージョン情報などは以下のリポジトリをご確認ください。
Discussion