OIDC 認証¶
Gramps Web は OpenID Connect (OIDC) 認証をサポートしており、ユーザーは外部のアイデンティティプロバイダーを使用してログインできます。これには、Google、Microsoft、GitHub などの一般的なプロバイダーや、Keycloak、Authentik などのカスタム OIDC プロバイダーが含まれます。
概要¶
OIDC 認証を使用すると、次のことが可能です:
- ユーザー認証のために外部アイデンティティプロバイダーを使用する
- 複数の認証プロバイダーを同時にサポートする
- OIDC グループ/ロールを Gramps Web ユーザーロールにマッピングする
- シングルサインオン (SSO) とシングルサインアウトを実装する
- 必要に応じてローカルのユーザー名/パスワード認証を無効にする
設定¶
OIDC 認証を有効にするには、Gramps Web の設定ファイルまたは環境変数に適切な設定を構成する必要があります。利用可能な OIDC 設定の完全なリストについては、サーバー設定 ページを参照してください。
Info
環境変数を使用する場合は、各設定名の前に GRAMPSWEB_ を付けることを忘れないでください(例: GRAMPSWEB_OIDC_ENABLED)。詳細については、設定ファイルと環境変数の違い を参照してください。
組み込みプロバイダー¶
Gramps Web は一般的なアイデンティティプロバイダーのサポートを組み込んでいます。これらを使用するには、クライアント ID とクライアントシークレットを提供するだけです:
- Google:
OIDC_GOOGLE_CLIENT_IDとOIDC_GOOGLE_CLIENT_SECRET - Microsoft:
OIDC_MICROSOFT_CLIENT_IDとOIDC_MICROSOFT_CLIENT_SECRET - GitHub:
OIDC_GITHUB_CLIENT_IDとOIDC_GITHUB_CLIENT_SECRET
複数のプロバイダーを同時に構成することができます。システムは、設定値に基づいてどのプロバイダーが利用可能かを自動的に検出します。
カスタム OIDC プロバイダー¶
カスタム OIDC プロバイダー(Keycloak、Authentik、または任意の標準 OIDC 準拠プロバイダー)には、次の設定を使用します:
| キー | 説明 |
|---|---|
OIDC_ENABLED |
OIDC 認証を有効にするかどうかのブール値。True に設定します。 |
OIDC_ISSUER |
プロバイダーの発行者 URL |
OIDC_CLIENT_ID |
OIDC プロバイダーのクライアント ID |
OIDC_CLIENT_SECRET |
OIDC プロバイダーのクライアントシークレット |
OIDC_NAME |
カスタム表示名(オプション、デフォルトは "OIDC") |
OIDC_SCOPES |
OAuth スコープ(オプション、デフォルトは "openid email profile") |
必要なリダイレクト URI¶
OIDC プロバイダーを構成する際には、次のリダイレクト URI を登録する必要があります:
ワイルドカードをサポートする OIDC プロバイダーの場合:(例:Authentik)
https://your-gramps-backend.com/api/oidc/callback/*
ここで * は正規表現のワイルドカードです。プロバイダーの正規表現インタープリターによっては、これが .* や類似のものになることもあります。
プロバイダーが必要とする場合は、正規表現が有効になっていることを確認してください(例:Authentik)。
ワイルドカードをサポートしない OIDC プロバイダーの場合:(例:Authelia)
https://your-gramps-backend.com/api/oidc/callback/custom
ロールマッピング¶
Gramps Web は、アイデンティティプロバイダーからの OIDC グループまたはロールを Gramps Web ユーザーロールに自動的にマッピングできます。これにより、アイデンティティプロバイダーでユーザーの権限を中央管理できます。
設定¶
ロールマッピングを構成するには、次の設定を使用します:
| キー | 説明 |
|---|---|
OIDC_ROLE_CLAIM |
ユーザーのグループ/ロールを含む OIDC トークン内のクレーム名。デフォルトは "groups" |
OIDC_GROUP_ADMIN |
Gramps の "Admin" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
OIDC_GROUP_OWNER |
Gramps の "Owner" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
OIDC_GROUP_EDITOR |
Gramps の "Editor" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
OIDC_GROUP_CONTRIBUTOR |
Gramps の "Contributor" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
OIDC_GROUP_MEMBER |
Gramps の "Member" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
OIDC_GROUP_GUEST |
Gramps の "Guest" ロールにマッピングされる OIDC プロバイダーのグループ/ロール名 |
ロールマッピングの動作¶
- ロールマッピングが構成されていない場合(
OIDC_GROUP_*変数が設定されていない場合)、既存のユーザーロールは保持されます - ユーザーは、グループメンバーシップに基づいて与えられる最高のロールが割り当てられます
- ロールマッピングはデフォルトで大文字と小文字を区別します(OIDC プロバイダーによります)
OIDC ログアウト¶
Gramps Web は OIDC プロバイダーのためのシングルサインアウト (SSO ログアウト) をサポートしています。ユーザーが OIDC を介して認証した後に Gramps Web からログアウトすると、プロバイダーが end_session_endpoint をサポートしている場合、アイデンティティプロバイダーのログアウトページに自動的にリダイレクトされます。
バックチャネルログアウト¶
Gramps Web は OpenID Connect バックチャネルログアウト仕様を実装しています。これにより、アイデンティティプロバイダーは、ユーザーが他のアプリケーションまたはアイデンティティプロバイダー自体からログアウトしたときに Gramps Web に通知できます。
設定¶
アイデンティティプロバイダーとのバックチャネルログアウトを構成するには:
-
アイデンティティプロバイダーのクライアント設定にバックチャネルログアウトエンドポイントを登録します:
https://your-gramps-backend.com/api/oidc/backchannel-logout/ -
プロバイダーを構成して ログアウト通知を送信します。具体的な手順はプロバイダーによって異なります:
Keycloak:
- クライアント設定で「設定」に移動します
- 「バックチャネルログアウトURL」を
https://your-gramps-backend.com/api/oidc/backchannel-logout/に設定します - セッションベースのログアウトを希望する場合は「バックチャネルログアウトセッションが必要」を有効にします
Authentik:
- プロバイダー設定でバックチャネルログアウト URL を追加します
- プロバイダーがログアウトトークンを送信するように構成されていることを確認します
トークンの有効期限
JWT トークンのステートレスな性質のため、バックチャネルログアウトは現在ログアウトイベントを記録しますが、すでに発行された JWT トークンを即座に取り消すことはできません。トークンは有効期限が切れるまで有効です(デフォルト:アクセストークンの有効期限は 15 分)。
セキュリティを強化するために、次のことを検討してください:
- JWT トークンの有効期限を短縮する (
JWT_ACCESS_TOKEN_EXPIRES) - アイデンティティプロバイダーからログアウトする際に、ユーザーに Gramps Web から手動でログアウトするように教育する
動作の仕組み
ユーザーがアイデンティティプロバイダーまたは他のアプリケーションからログアウトすると:
- プロバイダーは Gramps Web のバックチャネルログアウトエンドポイントに
logout_tokenJWT を送信します - Gramps Web はトークンを検証し、ログアウトイベントを記録します
- ログアウトトークンの JTI がリプレイ攻撃を防ぐためにブロックリストに追加されます
- ユーザーの JWT を使用した新しい API リクエストは、トークンが期限切れになると拒否されます
設定例¶
カスタム OIDC プロバイダー (Keycloak)¶
TREE="My Family Tree"
BASE_URL="https://mytree.example.com"
SECRET_KEY="..." # あなたの秘密鍵
USER_DB_URI="sqlite:////path/to/users.sqlite"
# カスタム OIDC 設定
OIDC_ENABLED=True
OIDC_ISSUER="https://auth.example.com/realms/myrealm"
OIDC_CLIENT_ID="gramps-web"
OIDC_CLIENT_SECRET="your-client-secret"
OIDC_NAME="Family SSO"
OIDC_SCOPES="openid email profile"
OIDC_AUTO_REDIRECT=True # オプション:SSO ログインに自動的にリダイレクト
OIDC_DISABLE_LOCAL_AUTH=True # オプション:ユーザー名/パスワードログインを無効にする
# オプション:OIDC グループから Gramps ロールへのロールマッピング
OIDC_ROLE_CLAIM="groups" # またはプロバイダーに応じて "roles"
OIDC_GROUP_ADMIN="gramps-admins"
OIDC_GROUP_EDITOR="gramps-editors"
OIDC_GROUP_MEMBER="gramps-members"
EMAIL_HOST="mail.example.com"
EMAIL_PORT=465
EMAIL_USE_TLS=True
EMAIL_HOST_USER="gramps@example.com"
EMAIL_HOST_PASSWORD="..." # あなたの SMTP パスワード
DEFAULT_FROM_EMAIL="gramps@example.com"
組み込みプロバイダー (Google)¶
TREE="My Family Tree"
BASE_URL="https://mytree.example.com"
SECRET_KEY="..." # あなたの秘密鍵
USER_DB_URI="sqlite:////path/to/users.sqlite"
# Google OAuth
OIDC_GOOGLE_CLIENT_ID="your-google-client-id"
OIDC_GOOGLE_CLIENT_SECRET="your-google-client-secret"
複数のプロバイダー¶
複数の OIDC プロバイダーを同時に有効にできます:
TREE="My Family Tree"
BASE_URL="https://mytree.example.com"
SECRET_KEY="..." # あなたの秘密鍵
USER_DB_URI="sqlite:////path/to/users.sqlite"
# カスタムプロバイダー
OIDC_ENABLED=True
OIDC_ISSUER="https://auth.example.com/realms/myrealm"
OIDC_CLIENT_ID="gramps-web"
OIDC_CLIENT_SECRET="your-client-secret"
OIDC_NAME="Company SSO"
# Google OAuth
OIDC_GOOGLE_CLIENT_ID="your-google-client-id"
OIDC_GOOGLE_CLIENT_SECRET="your-google-client-secret"
# GitHub OAuth
OIDC_GITHUB_CLIENT_ID="your-github-client-id"
OIDC_GITHUB_CLIENT_SECRET="your-github-client-secret"
Authelia¶
Gramps Web のためのコミュニティ製 OIDC セットアップガイドは、公式 Authelia ドキュメントウェブサイト で入手できます。
Keycloak¶
Keycloak の設定のほとんどはデフォルトのままで問題ありません(クライアント → クライアントを作成 → クライアント認証 ON)。 いくつかの例外があります:
- OpenID スコープ –
openidスコープはすべての Keycloak バージョンでデフォルトで含まれていません。問題を避けるために手動で追加してください:クライアント → [Gramps クライアント] → クライアントスコープ → スコープを追加 → 名前:openid→ デフォルトとして設定。 -
ロール – ロールはクライアントレベルまたはレルムごとにグローバルに割り当てることができます。
- クライアントロールを使用している場合は、
OIDC_ROLE_CLAIM設定オプションを次のように設定します:resource_access.[gramps-client-name].roles - Gramps にロールを表示させるには、クライアントスコープ(特定のクライアントの下ではなく、トップレベルのセクション)に移動し、次に:ロール → マッパー → クライアントロール → ユーザー情報に追加 → ON.
- クライアントロールを使用している場合は、