パブリッシュ層での AEM as a Cloud Service の Open ID Connect のサポート open-id-connect-support-for-aem-as-a-cloud-service-on-publish-tier
はじめに introduction
組織がデジタルエクスペリエンスを最新化する際に、安全で拡張性の高い ID 管理は基本的な要件になります。 組織がデジタルエクスペリエンスを最新化する際に、安全で拡張性の高い ID 管理が基本的な要件になります。 Adobe Experience Manager(AEM)Cloud Service は、パブリッシュ層で OpenID Connect(OIDC)をサポートするようになりました。これにより、Entra ID(Azure AD)、Google、Okta、Auth0、Ping Identity、ForgeRock、OIDC でサポートされる IDP など、主要な ID プロバイダー(IdP)とのシームレスで標準ベースの統合が可能になります。
OIDC は、OAuth 2.0 プロトコルの上にある ID レイヤーで、開発者のシンプルさを維持しながら、堅牢なユーザー認証を可能にします。 これは、安全なユーザーログインと ID フェデレーションが必要な、B2C、イントラネット、パートナーポータルのシナリオで広く採用されています。
これまで、AEM のお客様は、パブリッシュ層に独自のカスタムログインロジックを実装する責任がありました。これにより、開発時間が長くなり、長期的なメンテナンスとセキュリティの課題が発生していました。 AEM Cloud Service では、OIDC のネイティブサポートにより、パブリッシュ環境にアクセスするエンドユーザー向けに、安全で拡張可能な、アドビでサポートされる認証メカニズムを提供することで、この負担を軽減します。
パーソナライズされた消費者向け web サイトを提供する場合でも、認証済みの内部ポータルを提供する場合でも、パブリッシュでの OIDC は ID フェデレーションを簡素化し、一元化された ID ガバナンスを通じてリスクを軽減します。 また、組織が俊敏性を犠牲にすることなく、最新のコンプライアンスとセキュリティ標準を満たすのにも役立ちます。
OIDC 認証用の AEM の設定 configure-aem-oidc-authentication
前提条件 prerequisits
次の情報が使用可能または定義済みであることを前提としています。
- AEM リポジトリで保護されるコンテンツのパス
- 設定する IdP の識別子。 これは、任意の文字列を指定できます
Idp 設定からの情報:
- IdP で設定されたクライアント ID
- Idp で設定されたクライアント秘密鍵。 PKCE が Idp で設定されている場合、クライアント秘密鍵は使用できません。 設定ファイルにプレーンテキスト値を保存しないでください。 CM 秘密鍵を使用して参照します
- Idp で設定された範囲。 少なくとも
openid
範囲を指定する必要があります - PKCE が IdP で有効になっているかどうか
callbackUrl
は、ポイント 1 で定義された設定済みパスの 1 つを使用し、サフィックス/j_security_check
を追加して定義されます。- 標準の
.well-known
ファイルにアクセスするためのbaseUrl
。 例えば、よく知られている URL がhttps://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0/.well-known/openid-configuration
の場合、baseUrl
はhttps://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891
です。
設定ファイルの概要 overview-of-the-configuration-files
設定する必要があるファイルのリストを以下に示します。
- OIDC 接続:これは、
OidcAuthenticationHandler
がユーザーを認証するために、または他のコンポーネントが OAuth を使用して IdP によって保護されているリソースへのアクセスを承認するために使用します - OIDC 認証ハンドラー:これは、設定されたパスにアクセスするユーザーの認証に使用される認証ハンドラーです
- UserInfoProcessor:このコンポーネントは、IdP によって受信された情報を処理します。 顧客が拡張して、カスタムロジックを実装できます
- デフォルトの同期ハンドラー:このコンポーネントは、リポジトリ内にユーザーを作成します
- ExternalLoginModule:このコンポーネントは、ローカルの Oak リポジトリ内のユーザーを認証します。
次の図に、前述の設定要素がどのようにリンクされているかを示します。 これらは ServiceFactory
コンポーネントなので、~uniqueid
は任意のランダムな一意の文字列にすることができます。
OIDC 接続の設定 configure-the-oidc-connection
まず、OIDC 接続を設定する必要があります。 複数の OIDC 接続を設定でき、それぞれに異なる名前を付ける必要があります。
-
設定を格納する新しい
.cfg.json
ファイルを作成します。 例えば、org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
を使用できます。azure サフィックスは、接続の一意の ID にする必要があります。 -
次の例の設定形式に従います。
code language-none { "name":"azure", "scopes":[ "openid" ], "baseUrl":"<https://login.microsoftonline.com/53279d7a-438f-41cd-a6a0-fdb09efc8891/v2.0>", "clientId":"5199fc45-8000-473e-ac63-989f1a78759f", "clientSecret":"xxxxxx" }
-
そのプロパティを次のように設定します。
- 「name」 は、ユーザーが定義できます。
baseUrl
、clientid
およびclientSecret
は、IdP から取得される設定値です。- scopes には、少なくとも
openid
の値を含める必要があります。
OIDC 認証ハンドラーの設定 configure-oidc-authentication-handler
次に、OIDC 認証ハンドラーを設定します。 複数の OIDC 接続を設定できます。 それぞれに異なる名前を付ける必要があります。 同じ OAK 外部 ID プロバイダーを共有する場合は、ユーザーを共有できます。
-
設定ファイルを作成します。 この例では、
org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
を使用します。azure
サフィックスは、一意の ID にする必要があります。 以下の設定ファイルの例を参照してください。code language-none { "path":"/content/tests/us/en/test-7", "callbackUri":"http://localhost:14503/content/tests/us/en/test-7/j_security_check", "pkceEnabled":false, "defaultConnectionName":"azure" "idp": "azure-idp" }
-
その後、そのプロパティを次のように設定します。
path
:保護するパスcallbackUri
:保護するパスにサフィックス/j_security_check
を追加しますdefaultConnectionName
:前の手順で OIDC 接続に定義したのと同じ名前で設定します+pkceEnabled
:true
:認証コードフローでの Proof Key for Code Exchange(PKCE)idp
:OAK 外部 ID プロバイダーの名前。 異なる OAK IDP では、ユーザーまたはグループを共有できません
SlingUserInfoProcessor の設定
-
設定ファイルを作成します。 この例では、
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessor~azure.cfg.json
を使用します。azure
サフィックスは、一意の ID にする必要があります。 以下の設定ファイルの例を参照してください。code language-none { "groupsInIdToken":true, "groupsClaimName": "groups", "connection":"azure", "storeAccessToken": false, "storeRefreshToken": false }
-
その後、そのプロパティを次のように設定します。
groupsInIdToken
:グループが ID トークンで送信される場合は、true に設定します。 値が false の場合や指定されていない場合、グループは UserInfo エンドポイントから読み取られます。groupsClaimName
:要求の名前には、AEM で同期されるグループが含まれます。connection
:前の手順で OIDC 接続に定義したのと同じ名前で設定しますstoreAccessToken
:アクセストークンをリポジトリに保存する必要がある場合は、true。 デフォルトでは、これは false です。 同じ IdP で保護されている外部サーバーに保存されているユーザーの代わりに、AEM がリソースにアクセスする必要がある場合にのみ、true に設定します。storeRefreshToken
:更新トークンをリポジトリに保存する必要がある場合は、true。 デフォルトでは、これは false です。 同じ IdP で保護されている外部サーバーに保存されているユーザーの代わりに、AEM がリソースにアクセスし、IdP からのトークンを更新する必要がある場合にのみ、true に設定します。
アクセストークンと更新トークンは、AEM マスターキーで暗号化されて保存されます。
同期ハンドラーの設定 configure-the-synchronization-handler
oak で認証されたユーザーを同期するには、1 つ以上の同期ハンドラーを設定する必要があります。 詳しくは、このページを参照してください。
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json
という名前のファイルを作成します。 azure サフィックスは、一意の ID にする必要があります。 プロパティの設定方法について詳しくは、Oak ユーザーとグループの同期ドキュメントを参照してください。 以下の設定の例を参照してください。
{
"user.expirationTime":"300s",
"user.membershipExpTime":"300s",
"user.propertyMapping":[
"profile/familyName=profile/familyName",
"profile/givenName=profile/givenName",
"rep:fullname=cn",
"profile/email=profile/email",
"oauth-tokens"
],
"user.pathPrefix":"azure",
"handler.name":"azure"
}
DefaultSyncHandler で設定する最も関連性の高い属性の一部を以下に示します。 Cloud Service では、動的グループメンバーシップを常に有効にする必要があります。
user.expirationTime
user.membershipExpTime
user.dynamicMembership
user.enforceDynamicMembership
group.dynamicGroups
UserInfoProcessor
の実装では、いくつかのプロパティのみが同期されます。 変更やカスタマイズが可能です。"profile/givenName=profile/given_name",
"profile/familyName=profile/family_name",
"rep:fullname=profile/name",
"profile/email=profile/email",
"access_token=access_token",
"refresh_token=refresh_token"
user.membershipNestingDepth
外部ログインモジュールの設定 configure-the-external-login-module
最後に、外部ログインモジュールを設定する必要があります。
-
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json
という名前のファイルを作成します。 以下の設定の例を参照してください。code language-none { "sync.handlerName":"azure", "idp.name":"azure-idp" }
-
そのプロパティを次のように設定します。
sync.handlerName
:以前に定義した同期ハンドラーの名前idp.name
:OIDC 認証ハンドラーで定義した OAK ID プロバイダー
オプション:カスタム UserInfoProcessor の実装 implement-a-custom-userinfoprocessor
ユーザーは ID トークンによって認証され、IdP に対して定義された userInfo
エンドポイントで追加の属性が取得されます。 追加の標準以外の操作を実行する必要がある場合、UserInfoProcessor のカスタム実装が Sling のデフォルト実装です。
例:Azure Active Directory を使用した OIDC 認証の設定
Azure Active Directory での新しいアプリケーションの設定 configure-a-new-application-in-azure-ad
-
Azure Active Directory ドキュメントに従って、Azure Active Directory に新しいアプリケーションを作成します。 アプリケーションの概要を示す画面がどのように表示されるかを以下に示します。
-
グループまたはアプリケーションの役割が必要な場合は、ドキュメントに従って、アプリケーションに対して有効にし、ID トークンで送信します。 設定したグループの例を以下に示します。
-
前述の手順に従って、必要な設定ファイルを作成します。 Azure AD に固有の例を以下に示します。
- oidc 接続、認証ハンドラー、DefaultSyncHandler の名前を
azure
のように定義します - Web サイトの URL:
www.mywebsite.com
- 保護するパス:
/content/wknd/us/en/adventures
- テナント:
tennat-id
- クライアント ID:
client-id
- 秘密鍵:
secret
- 要求の ID トークンで送信したグループ:
groups
- oidc 接続、認証ハンドラー、DefaultSyncHandler の名前を
org.apache.sling.auth.oauth_client.impl.OidcConnectionImpl~azure.cfg.json
{
"name":"azure",
"scopes":[
openid", "User.Read", "profile", "email
],
"baseUrl":"https://login.microsoftonline.com/tenant-id/v2.0",
"clientId":"client-id",
"clientSecret":"secret"
}
org.apache.sling.auth.oauth_client.impl.OidcAuthenticationHandler~azure.cfg.json
{
"callbackUri":"https://www.mywebsite.com/content/wknd/us/en/adventures/j_security_check",
"path":[
"/content/wknd/us/en/adventures"
],
"idp":"azure",
"defaultConnectionName":"azure"
}
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModuleFactory~azure.cfg.json
{
"sync.handlerName":"azure",
"idp.name":"azure"
}
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DefaultSyncHandler~azure.cfg.json
{
"user.expirationTime":"1s",
"user.membershipExpTime":"1s",
"user.propertyMapping":[
"profile/givenName=profile/given_name",
"profile/familyName=profile/family_name",
"rep:fullname=profile/name",
"profile/email=profile/email",
"access_token=access_token",
"refresh_token=refresh_token"
],
"user.pathPrefix":"azure",
"group.pathPrefix": "oidc",
"user.membershipNestingDepth": "1",
"handler.name":"azure"
}
org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl~azure.cfg.json
{
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false",
"connection": "azure",
"groupsClaimName": "groups"
}
Azure AD グループに関する追加情報 additional-information-about-azure-ad-groups
Microsoft Azure Portal でエンタープライズアプリケーションのグループを設定するには、エンタープライズアプリケーション でアプリケーションを検索し、グループを追加する必要があります。
ID トークンでグループ要求を有効にするには、Microsoft Azure Portal の「トークン設定」セクションで要求を追加します。
SlingUserInfoProcessor
の設定は、以下の例のように変更する必要があります。
変更する必要があるファイル名は、org.apache.sling.auth.oauth_client.impl.SlingUserInfoProcessorImpl.cfg.json
です。 コンテンツは、次のように設定する必要があります。
{
"connection": "azure",
"groupsInIdToken": "true",
"storeAccessToken": "false",
"storeRefreshToken": "false"
}