
認証サービスをクラウドに依存せず、自社インフラで完全にコントロールしたいというニーズが高まっています。Authgear Server は、Auth0 やFirebase Auth の代替として使えるオープンソースの認証基盤です。本記事では、Docker Composeを使ったローカル環境でのセットアップから、Kubernetes上での本番デプロイまで、実践的に解説します。
Authgear Serverとは?
Authgear Server は、Apache 2.0ライセンスで公開されているオープンソースの認証認可サーバーです。Go言語で実装されており、以下のコンポーネントで構成されています:
- Authgear Server: 認証認可の中核となるサーバー
- Portal: プロジェクトや設定を管理するWebインターフェース
- AuthUI: ログイン、ユーザー登録、プロフィール設定画面のカスタマイズ可能なUI
- Admin API: GraphQLベースの管理API
主な特徴は以下の通りです:
- パスキー(Passkeys)対応: WebAuthn 標準に基づくパスワードレス認証
- 多要素認証(MFA): TOTP、SMS、メールOTPなど
- ソーシャルログイン: Google、Facebook、Apple、LinkedIn、WeChatなど
- エンタープライズSSO: OIDC、OAuth 2.0、SAML対応
- RBAC: ロールベースアクセス制御
- Webhook & Hooks: TypeScriptでカスタムロジックを実装可能
Auth0 / Firebase Authとの比較
セルフホストのメリット
- データ主権: ユーザーデータを自社インフラで完全管理
- コスト最適化: 大規模ユースケースでは従量課金より安価
- カスタマイズ性: ソースコードレベルでのカスタマイズが可能
- ベンダーロックイン回避: 特定のクラウドサービスに依存しない
考慮すべき点
- 運用負荷: インフラの構築、運用、監視が必要
- スケーラビリティ: 負荷に応じたスケーリング設計が必要
- セキュリティ: 自社でセキュリティ対策を実装
システム要件
Authgear Serverを運用するには、以下のリソースが必要です:
最小構成
- CPU: 2コア
- メモリ: 4GB
- PostgreSQL: バージョン16以上(
pg_partman拡張必須)、最小5GBストレージ - Redis: バージョン6.2以上(ユーザーあたり約30KB)
データベース
Authgearは3つの独立したPostgreSQLデータベースを使用します:
- メインデータベース: ユーザー情報、設定など
- 監査ログデータベース: 監査ログ(オプション)
- 検索データベース: 全文検索用(Elasticsearchを使わない場合)
オプション
- Elasticsearch: 10,000ユーザー以上の場合、検索パフォーマンス向上のため推奨
- オブジェクトストレージ: プロフィール画像機能を有効にする場合(AWS S3、GCP GCS、Azure Blob Storage対応)
Docker Composeでローカルセットアップ
最も簡単に始める方法は、公式のサンプルリポジトリ を使用することです。
1. リポジトリのクローン
git clone https://github.com/authgear/authgear-example-docker-compose.git
cd authgear-example-docker-compose
2. hostsファイルの編集
ローカル環境で動作させるため、/etc/hostsに以下を追加します:
127.0.0.1 accounts.localhost
127.0.0.1 portal.localhost
3. 依存サービスの起動
PostgreSQL 、Redis 、MinIO を起動します:
docker compose up -d postgres redis minio
4. データベースマイグレーション
各コンポーネントのデータベーススキーマを作成します:
docker compose run --rm -it authgear authgear database migrate up
docker compose run --rm -it authgear authgear audit database migrate up
docker compose run --rm -it authgear authgear images database migrate up
docker compose run --rm -it authgear-portal authgear-portal database migrate up
5. オブジェクトストレージの設定
MinIO コンテナに接続してバケットを作成します:
docker compose exec -it minio bash
# コンテナ内で実行
mc alias set local http://localhost:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD"
mc mb local/images
mc mb local/userexport
exit
6. Authgearサービスの起動
docker compose up
7. プロジェクト設定の初期化
accountsという名前の最初のプロジェクトを作成します:
docker compose run --rm --workdir "/work" -v "$PWD/accounts:/work" authgear \
authgear init --interactive=false \
--purpose=portal \
--for-helm-chart=true \
--app-id="accounts" \
--public-origin="http://accounts.localhost:3100" \
--portal-origin="http://portal.localhost:8010" \
--portal-client-id=portal \
--phone-otp-mode=sms \
--disable-email-verification=true \
--search-implementation=postgresql \
-o /work
8. プロジェクトの作成
docker compose run --rm --workdir "/work" -v "$PWD/accounts:/work" \
authgear-portal authgear-portal internal configsource create /work
docker compose run --rm authgear-portal authgear-portal internal domain \
create-default --default-domain-suffix ".localhost"
9. 管理者アカウントの作成
Admin APIを使って最初のユーザーを作成します:
docker compose exec authgear authgear internal admin-api invoke \
--app-id accounts \
--endpoint "http://127.0.0.1:3002" \
--host "accounts.localhost:3100" \
--query '
mutation createUser($email: String!, $password: String!) {
createUser(input: {
definition: {
loginID: {
key: "email"
value: $email
}
}
password: $password
}) {
user {
id
}
}
}
' \
--variables-json '{"email":"admin@example.com","password":"password123"}'
レスポンスからユーザーIDを取得し、Base64デコードします:
echo "VXNlcjoyMDhkYWFkYy0wZmM4LTQ1Y2MtODQwNS01ODIzNTVmYTI0ZWU" | basenc --base64url --decode
# 出力例: User:208daadc-0fc8-45cc-8405-582355fa24ee
10. 管理者権限の付与
取得したユーザーIDを使って、Portalへのアクセス権を付与します:
docker compose run --rm authgear-portal authgear-portal internal collaborator add \
--app-id accounts \
--user-id 208daadc-0fc8-45cc-8405-582355fa24ee \
--role owner
11. Portalへのアクセス
ブラウザで http://portal.localhost:8010 にアクセスし、作成したアカウントでログインします。
Kubernetes上での本番デプロイ
本番環境では、Helm チャートを使用したKubernetes 上でのデプロイが推奨されます。
前提条件
- Kubernetes 1.23以上
- NGINX Ingress Controller
- cert-manager (Let’s Encrypt でTLS証明書を自動管理)
- PostgreSQL
16以上(
pg_partman拡張インストール済み) - Redis 6.2以上
デプロイ手順の概要
- ネームスペース作成
kubectl create namespace authgear
kubectl create namespace authgear-apps
- 独自のHelmチャート作成
helm create authgear-deploy
cd authgear-deploy/templates
rm -r test/ NOTES.txt deployment.yaml hpa.yaml ingress.yaml service.yaml serviceaccount.yaml
- Chart.yamlに依存関係を追加
dependencies:
- name: authgear
version: "10.26.1" # 最新バージョンを使用
repository: "https://authgear.github.io/helm-charts"
- データベースマイグレーション実行
docker run --rm -it quay.io/theauthgear/authgear-server:TAG \
authgear database migrate up \
--database-url DATABASE_URL \
--database-schema public
- values.yamlの設定
詳細な設定項目は公式ドキュメント を参照してください。主要な設定項目:
authgear.databaseURL: PostgreSQL接続URLauthgear.redisURL: Redis接続URLauthgear.baseHost: ドメイン名(例:myapp.com)authgear.smtp.*: SMTPサーバー設定
- Helmチャートのインストール
helm install authgear-deploy ./authgear-deploy \
--namespace authgear \
--values ./authgear-deploy/values.yaml
主要機能の設定
パスキー認証の有効化
Portalの Authentication > Passkeys から有効化できます。WebAuthn APIに基づくパスワードレス認証が利用可能になります。
ソーシャルログインの設定
Google、Facebook、AppleなどのOAuthプロバイダーを簡単に設定できます。各プロバイダーのClient IDとClient Secretを入力するだけです。
Webhook & TypeScript Hooks
ユーザー登録やログインなどのイベントをトリガーにカスタムロジックを実行できます:
export default async function(event: any) {
// 新規ユーザー登録時の処理
if (event.type === 'user.created') {
const userId = event.payload.user.id;
// 外部CRMシステムに登録するなど
await registerToCRM(userId);
}
}
セキュリティ対策
Authgear Serverは、エンタープライズグレードのセキュリティ機能を提供します:
- ブルートフォース攻撃対策: レート制限とアカウントロック
- Bot保護: reCAPTCHA統合
- 監査ログ: すべての認証イベントを記録
- セッション管理: デバイスごとのセッション制御
まとめ
Authgear Serverは、Auth0やFirebase Authの代替として十分な機能を持つオープンソース認証基盤です。Docker Composeで簡単にローカル環境を構築でき、Kubernetes上での本番運用にも対応しています。
個人的には、データ主権を確保しながら最新の認証技術を使える点が特に魅力的だと感じています。セルフホストによる運用負荷はありますが、大規模なユーザーベースを持つサービスではコスト面でもメリットがあります。
オープンソースの認証基盤に興味がある方は、ぜひAuthgear Serverを試してみてください。