5 IDCSを使用したOCI上のシングル・サインオン用のWebLogicクラスタとHelidonアプリケーションの統合

Oracle WebLogic Server (WebLogic Server)とHelidonの統合により、Kubernetes環境でOpenID Connect (OIDC)をOracle Identity Cloud Service (IDCS)とともに使用して、WebLogic ServerおよびHelidonにデプロイされたアプリケーションでシングル・サインオン(SSO)認証メカニズムを使用できます。WebLogic ServerアプリケーションとHelidonマイクロサービスの間でSSOを使用すると、セキュアなサービスを保証しながら認証を共有することで、最新のアプリケーションにおけるセキュリティが簡素化されます。SSOは様々な方法で実装できます。一般的なアプローチは、OAuthやOIDCなどのトークンベースの認証プロトコルを使用することです。
KubernetesクラスタでのWebLogic ServerとHelidonの統合により、SSO認証で次のことが可能になります:
  • WebLogicクラスタにデプロイされている、IDCSで構成されたクライアント・アプリケーションにアクセスします。
  • IDCSで構成されたHelidon RESTエンドポイントにアクセスします。
  • Helidon RESTエンドポイントからWebLogic Serverアプリケーション・エンドポイントにアクセスします。

次の図は、Oracle Cloud Infrastructure (OCI)環境でIDCSを使用したSSO用のWebLogic ServerとHelidonの統合を示しています:

図5-1 SSO用のWebLogicクラスタとHelidonの統合



図のステップの説明:

  1. クライアントは、ブラウザを使用して、Bearerトークンなしで保護されたHelidonリソースをコールし、IDCS SSOログイン・ページにリダイレクトされます。
  2. クライアントは、ログイン・ページで正常にサインインした後、認可コードを使用してHelidonアプリケーションにリダイレクトされます。
  3. Helidonが認可コードを受信すると、JWTトークンがIDCSからリクエストされ、返されて、JSESSIONID Cookieとして保存されます。
  4. 新しい認可コード、クライアントIDおよびクライアント・シークレットでJWTトークンがリクエストされます。
  5. 最後のリダイレクトが、最初にコールされたリソースであるHelidonに戻ります。今回はJSESSIONID内の有効なBearerトークンが使用されます。
  6. BearerトークンがWebLogic Serverアプリケーション・リソースのクライアント・コールに伝播されます。
  7. WebLogic Serverアプリケーション・リソースもOIDCで保護され、トークンをIDCSに対して検証します。

この章の内容は次のとおりです。

前提条件

前提条件は、KubernetesクラスタでのWebLogic ServerとHelidonの統合に基づいています。このリストは、サポートされている他のプラットフォームを使用する場合には異なる可能性があります。「WebLogic ServerとHelidonの統合のためのKubernetesクラスタの準備」を参照してください。
次のものが利用可能であることを確認します。
  • Kubernetesクラスタにアクセスするためのkubectlが設定されたローカル・マシン。この設定の詳細は、Oracle Cloud Infrastructure Container Engine for Kubernetesを使用したクラスタの作成チュートリアルのクラスタ用のkubeconfigファイルの設定およびkubectlおよびKubernetes Dashboardによるクラスタへのアクセスの検証に関する項を参照してください。
  • WebLogic Kubernetes Operator (Operator)の設定。Operator Quick Startを参照してください。
  • パブリックIPを持つOCIロード・バランサと、WebLogic ServerおよびHelidonアプリケーションのURLパターンに従って適用されるロード・バランサ・ルール。次の例は、ルールがどのように適用されるかを示しています:
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: cquotes
      namespace: sample-domain1-ns
    spec:
      routes:
      - kind: Rule
        match: PathPrefix(`/<WLS application url>)
        services:
        - kind: Service
          name: sample-domain1-cluster-cluster-1
          port: 8001
          sticky:
            cookie:
              httpOnly: true
              name: cookie
              secure: false
              sameSite: none
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: helidon-quickstart-mp
      namespace: default
    spec:
      routes:
      - kind: Rule
        match: PathPrefix(`/<helidon rest url>`)
        services:
        - kind: Service
          name: helidon-quickstart-mp
          port: 8080
    ---
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: helidon-oidc
      namespace: default
    spec:
      routes:
      - kind: Rule
        match: PathPrefix(`/oidc`)
        services:
        - kind: Service
          name: helidon-quickstart-mp
          port: 8080
  • アプリケーションを登録する権限があるIDCSへのアクセス。ユーザーを作成する手順は、『Oracle Identity Cloud Serviceの管理』ユーザー・アカウントの作成に関する項を参照してください。
  • WebLogicクラスタ・クライアント・アプリケーションをビルドするためのサポートされているJDK (JDK 8以降など)およびMaven (必要な場合)。
  • Helidonのデプロイについては、次を参照してください:
  • OpenID Connect (OIDC)の基本的な理解。OpenIDを参照してください。

シングル・サインオン用のHelidonとのWebLogicクラスタ統合の設定

WebLogicクラスタとHelidonの統合を容易にするために、WebLogic Serverは、WebLogic Server Kubernetes Operator (Operator)を使用してKubernetesクラスタにデプロイされます。Helidonコンテナも同じKubernetesクラスタ内にデプロイされます。WebLogic Server管理コンソール、クライアント・アプリケーション(WebLogicクラスタにデプロイ)、およびHelidon RESTエンドポイント(Helidonマイクロサービス・アプリケーションによって公開)へのアクセスには、パブリックIPを持つデフォルトのOCIロード・バランサが使用されます。Helidonマイクロサービス・アプリケーションは、SSOを使用した認証および認可のためにOracle Identity Cloud Serviceと統合されたRESTエンドポイントを介して、WebLogicクラスタ・アプリケーションと通信します。
統合を設定するには:
  1. WebLogicクラスタ・アプリケーションをOracle Identity Cloud Serviceと統合します。
    1. Oracle Identity Cloud Serviceでアプリケーションを登録します。

      次のクライアント構成の詳細は重要です。クライアント・アプリケーションのソース・コードでこれらのパラメータの値を使用して、Oracle Identity Cloud Serviceがクライアント・アプリケーションと安全に通信できるようにするためです。

      • 許可される権限付与タイプ: クライアント・アプリケーションがOracle Identity Cloud Serviceからの検証をリクエストするときに使用できる権限付与タイプ。
      • リダイレクトURL: Oracle Identity Cloud Serviceでの認証の成功後にユーザーがリダイレクトされるクライアント・アプリケーションの絶対URL。
      • ログアウトURL: ユーザーがクライアント・アプリケーションからログアウトした後にOracle Identity Cloud ServiceによってコールされるURL。
      • ログアウト後のリダイレクトURL: Oracle Identity Cloud Serviceからのログアウト後にユーザーがリダイレクトされるURL。

      クライアント・アプリケーションの登録およびアクティブ化が終了したら、クライアントIDクライアント・シークレットをメモします。クライアント・アプリケーションは、クライアントIDとクライアント・シークレット(ユーザーIDやパスワードなどのログイン資格証明に似たもの)を使用してOracle Identity Cloud Serviceと通信します。

      アプリケーションの登録の詳細は、『Oracle Identity Cloud Serviceの管理』機密アプリケーションの追加に関する項を参照してください。

    2. クライアント・アプリケーションをOracle Identity Cloud Serviceと統合します。

      このステップでは、クライアント・アプリケーションが認証中にOracle Identity Cloud Serviceに接続するように構成する必要があります。次の例に示すように、クライアント・アプリケーションのソース・コードでCLIENT_ID、CLIENT_SECRET (IDCSでのクライアント・アプリケーションの登録時に生成されたクライアントIDクライアント・シークレットを使用します)、およびIDCS_URLを更新します:

      //YOUR IDENTITY DOMAIN AND APPLICATION CREDENTIALS
      public static final String CLIENT_ID = "<your client id>";
      public static final String CLIENT_SECRET = "<your client secret>";
      public static final String IDCS_URL = "https://example.identity.oraclecloud.com";

      ノート:

      クライアントIDおよびクライアント・シークレットは、SSO認証のアクセス・トークンを取得するために使用されます。
    3. WebLogicクラスタでクライアント・アプリケーションをビルドおよびデプロイします。

      WebLogic ServerでサポートされているJDKを使用してクライアント・アプリケーションをビルドし、そのアプリケーションをWebLogicクラスタにデプロイします。デプロイメントが成功すると、クライアント・アプリケーションはWebLogic Server管理コンソールの「デプロイメント」セクションにActiveステータスで表示されます。

    4. WebLogic ServerアプリケーションをSSOに対して検証します。

      ブラウザを使用して、クライアント・アプリケーションURL http://{OCI LB_IP}/<wls app>にアクセスします。ここで、OCI LB_IPはロード・バランサのパブリックIP、wls appはWebLogicクラスタ・アプリケーションの名前です。SSOエンドポイントは、認証のためにIDCSログイン・ページにリダイレクトする必要があります。

      認証に成功すると、アプリケーションのコンテンツを表示できるようになります。

    アプリケーションとOracle Identity Cloud Serviceの統合の例は、顧客見積とOracle Identity Cloud Serviceの統合に関する項を参照してください。
  2. HelidonアプリケーションをOracle Identity Cloud Serviceと統合します。
    1. Oracle Identity Cloud ServiceでHelidon MPクライアント・アプリケーションを登録します。

      次のパラメータは重要です:

      • ダイレクトURL: <LB IP>/oidc/redirect
      • ログアウトURL: <LB IP>/oidc/logout
      • ログアウト後のリダイレクトURL: <Logout URL>
      • プライマリ・オーディエンス: HelidonアプリケーションのRESTエンドポイントに従った<LB IP>/
      • セカンダリ・オーディエンス: IDCSテナンシに従った<IDCS URI>

      Helidonアプリケーションの登録およびアクティブ化が終了したら、クライアントIDクライアント・シークレットをメモします。

    2. Helidonアプリケーションを設定します。

      次の例に示すように、Mavenを使用してHelidon MPサンプル・アプリケーションを作成します:

      mvn -U archetype:generate -DinteractiveMode=false \
          -DarchetypeGroupId=io.helidon.archetypes \
          -DarchetypeArtifactId=helidon-quickstart-mp \
          -DarchetypeVersion=3.2.0 \
          -DgroupId=io.helidon.examples \
          -DartifactId=helidon-quickstart-mp \
          -Dpackage=io.helidon.examples.quickstart.mp

      Helidon MP OIDC Security ProviderガイドのSet up Helidonを参照してください。

    3. HelidonアプリケーションのOIDC依存関係を構成します。
      プロジェクトは、helidon-quickstart-mpディレクトリからビルドおよび実行されます。このディレクトリに移動します:
      cd helidon-quickstart-mp
      1. 次の例に示すように、Maven依存関係をpom.xmlファイルに追加します:
        <dependency>
          <groupId>io.helidon.microprofile</groupId>
           <artifactId>helidon-microprofile-security</artifactId>
        </dependency>
        <dependency>
          <groupId>io.helidon.microprofile</groupId>
          <artifactId>helidon-microprofile-oidc</artifactId>
        </dependency>
        <dependency>
          <groupId>io.helidon.microprofile.jwt</groupId>
          <artifactId>helidon-microprofile-jwt-auth</artifactId>
        </dependency> 
      2. 次の例に示すように、要件およびIDCS構成に従ってapplication.yamlファイルを更新します:
        # These values should be as per IDCS configured application values
        security:
          config.require-encryption: false
          properties:
             # Oracle IDCS instance uri. Following URI may change depending on IDCS instance.
             idcs-uri: "${idcs-uri}"
             # IDCS Registered application client-id and secret
             # Register Confidential application for Helidon at IDCS and provide the client id and secret below.
             idcs-client-id: "${helidon-idcs-client-id}"
             idcs-client-secret: "${helidon-idcs-client-secret}"
             # Configure proxy if required.
             proxy-host: ""
             # Helidon application listening at port
             port: 8080
          providers:
            - abac:
            - oidc:
                client-id: "${security.properties.idcs-client-id}"
                # See [EncryptionFilter](https://helidon.io/docs/latest/apidocs/io.helidon.config.encryption/io/helidon/config/encryption/EncryptionFilter.html for details about encrypting passwords in configuration files.
                client-secret: "${security.properties.idcs-client-secret}"
                identity-uri: "${security.properties.idcs-uri}"
                # This redirect URI which should match at IDCS registered application Redirect URL
                # Redirect URL at IDCS follows http://<hostname:8080 or Load Balancer>/oidc/redirect
                redirect-uri: "/oidc/redirect"
                # scope-audience should match with IDCS Primary Audience , except adding "/" trailing character. 
                # At IDCS it will be http://<hostname:8080 or Load Balancer>/<REST endpoint>/. 
                # Mismatch in scope-audience causes failure in generating access token 
                scope-audience: "http://${load-balancer-ip}/<helidon REST endpoint>"
                # Mismatch in audience  causes failure in generating access token 
                audience: "${IDCS_URI}"
                # Front end host , it should be either hostname:8080 or load balancer ip
                frontend-uri: "http://${load-balancer-ip}"
                server-type: "idcs"
                logout-enabled: true
                # Configured IDCS Logout URL "http://<LB|HOSTNAME:PORT>/oidc/logout
                # Configured IDCS Post Logout Redirect URL "http://<LB|HOSTNAME:PORT>/loggedout"
                # Post logout Helidon REST endpoint or URI
                post-logout-uri: "/${logout url}"
                propagate: true
                outbound:
                   - name: "propagate-token"
                     hosts: [ "${load-balancer-ip}" ]
                redirect: true
                cookie-use: true
                header-use: true
      3. Helidon RESTエンドポイントをSSO用に構成します。

        @Authenticated注釈を追加することで、Helidon RESTエンドポイントをSSOで保護できます。Adding Securityの「Usage」の項を参照してください。

        @Authenticated注釈は、認証が強制されるサーバー・リソースを指定するために使用します。この注釈の使用例を次に示します:
        
        @Authenticated
        @GET
        @Produces(MediaType.APPLICATION_JSON)
          public JsonObject getDefaultMessage() {
              return createResponse("World");
          }
    4. Helidon MPアプリケーションを同じKubernetesクラスタにデプロイします。
      1. 次のコマンドを使用してDockerイメージをビルドします:
        docker build -t helidon-quickstart-mp .
      2. コンテナ・レジストリで作成およびホストされるHelidon Dockerイメージに基づいて、イメージ参照用のapp.yamlファイルを更新します:
        kind: Service
        apiVersion: v1
        metadata:
          name: helidon-quickstart-mp
          labels:
            app: helidon-quickstart-mp
        spec:
          type: NodePort
          selector:
            app: helidon-quickstart-mp
          ports:
          - port: 8080
            targetPort: 8080
            name: http
        ---
        kind: Deployment
        apiVersion: apps/v1
        metadata:
          name: helidon-quickstart-mp
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: helidon-quickstart-mp
          template:
            metadata:
              labels:
                app: helidon-quickstart-mp
                version: v1
            spec:
              containers:
              - name: helidon-quickstart-mp
                image: ${docker image repo}/helidon-quickstart-mp
                imagePullPolicy: Always
                ports:
                - containerPort: 8080
      3. Helidonアプリケーションを同じKubernetesクラスタにデプロイします。
        ローカル・マシンで次のkubectlコマンドを実行して、HelidonアプリケーションをKubernetesクラスタにデプロイします:
        kubectl create -f app.yaml
      4. 次のkubectlコマンドを実行して、Helidonのデプロイメントが成功したかどうかを検証します:
        kubectl get pods
        kubectl get service helidon-quickstart-mp

      quickstartの詳細は、Helidon MP Quickstartを参照してください。

    5. HelidonアプリケーションをSSOに対して検証します。

      ブラウザを使用して、RESTエンドポイントURL http://{LB IP}/<SSO configured REST endpoint>にアクセスします。ここで、LB_IPはロード・バランサのパブリックIP、SSO configured REST endpointはHelidon RESTエンドポイントです。

      IDCSでSSO認証に成功すると、RESTエンドポイントからレスポンスを受信します。

  3. HelidonアプリケーションとWebLogicクラスタ・アプリケーションをSSO用に統合します。
    1. Helidon SSO RESTエンドポイントからWebLogicクラスタ・アプリケーションSSOエンドポイントにアクセスします。Helidonは、Helidon SSOエンドポイントの認証後にJWTトークンを取得します。他のサービスをコールするために手動でトークンを使用するか、JAX-RSクライアントでトークンを自動的に伝播できます。次の例を参考にしてください:
      @Path("/helidon")
      @ApplicationScoped
      @Authenticated
      public class HelidonResource {
      
          @Inject
          @ConfigProperty(name = "wls.service.url")
          private URI wlsServiceUri;
      
          @Inject
          private JsonWebToken jwt;
      
          @Authenticated
          @GET
          @RolesAllowed({"secret_role"})
          @Produces(MediaType.APPLICATION_JSON)
          public JsonObject getDefaultMessage(@Context SecurityContext secCtx) {
              var user = secCtx.userName();
              var isInRole = secCtx.isUserInRole("secret_role");
      
              // Manually access the raw bearer token
              var bearerToken = jwt.getRawToken();
      
              // Bearer token is propagated automatically with the OIDC outbound propagation, 
              // no manual action is needed with the JAX-RS client
              JsonObject response = ClientBuilder.newClient()
                      .target(wlsServiceUri)
                      .request()
                      .buildGet()
                      .invoke(JsonObject.class);
      
              return Json.createObjectBuilder()
                      .add("user", user)
                      .add("is_secret_role", isInRole)
                      .add("wls-response", response)
                      .build();
          }
      }
    2. Helidon SSO RESTエンドポイントにアクセスして、HelidonアプリケーションとWebLogicクラスタ・アプリケーションの統合を検証します。

      Helidon RESTエンドポイントでSSO認証に成功すると、WebLogicクラスタ・アプリケーションにアクセスできるようになります。