Tableau 接続済みアプリを構成して埋め込みコンテンツの SSO を有効にする

Tableau Server のバージョン 2022.1 以降、からは、Tableau 接続済みアプリを使用すると、Tableau Server サイトと Tableau コンテンツが埋め込まれている外部アプリケーションとの間に明示的な信頼関係を構築できるため、シームレスで安全な認証エクスペリエンスを実現できます。Tableau Server 2022.3 で、Tableau 接続済みアプリは REST API 認証をサポートするように機能が拡張されました。Tableau Server 2023.3 では、接続済みアプリを介した REST API 認証はメタデータ API に対応しています。

接続済みアプリには、次の利点があります。

  • 埋め込み可能なコンテンツへのアクセス、およびそのコンテンツを埋め込みできる場所へのアクセスを制限する
  • ユーザーは、アイデンティティ プロバイダー (IdP) と統合しなくても、シングルサインオン (SSO) を使用して埋め込みコンテンツにアクセスできる
  • ユーザーは、外部アプリケーションから直接認証できる
  • Tableau REST API (および Tableau Server 2023.3 以降はメタデータ API) へのアクセスを、ユーザーに代わって JSON Web Token (JWT) を使用してプログラムで承認できる

注:

  • Tableau Server の UI なしの接続アプリ機能は、Tableau REST API の接続済みアプリのメソッド(新しいウィンドウでリンクが開く)を介して Tableau Server バージョン 2021.4 で使用できるようになりました。
  • 接続済みアプリを介した埋め込みを有効にするには、HTTP トラフィックに対して SSL を使用するように Tableau Server を構成する必要があります。
  • セッション トークンを有効にするためには、外部アプリケーションと外部アプリケーションをホストするサーバーの時計が協定世界時 (UTC) に設定されている必要があります。いずれかの時計が異なる規格を使用している場合、接続済みアプリは信頼されません。
  • Tableau 接続済みアプリと Salesforce 接続済みアプリは異なり、提供されている機能も異なります。現在、Tableau 接続済みアプリは、外部アプリケーションに Tableau ビューとメトリクスを埋め込めるように最適化されています。(2023 年 10 月、Tableau Cloud および Tableau Server バージョン 2023.3 で、メトリクスの埋め込み機能が廃止されました。)

接続済みアプリのしくみ

Tableau Server サイトと外部アプリケーション間の信頼関係は、JSON Web Token (JWT) 標準の認証トークンによって確立および検証されます。この認証トークンは、Tableau 接続済みアプリによって提供され、外部アプリケーションによって署名される共有シークレットを使用します。

接続済みアプリの主要コンポーネント

接続済みアプリの次のコンポーネントは、外部アプリケーションの JWT と連携して、ユーザーを認証し、埋め込みコンテンツを表示します。

  • シークレット: シークレットは、Tableau と外部アプリケーションで共有されるキーです。これらは、JWT を形成する署名で使用されます。接続アプリを使用して認証を埋め込む場合は、シークレットが必要です。シークレットは接続済みアプリで作成できます。シークレットの有効期限はなく、削除されるまで有効です。
  • ドメイン許可リスト: 各接続済みアプリで許可されているドメインのリストを指定できます。接続済みアプリを介して埋め込まれた Tableau コンテンツは、指定されたドメインでのみ許可されます。これにより、ビジネスで保護および承認されたドメインでコンテンツを公開することができます。
  • アクセス レベル: 接続済みアプリを 1 つのプロジェクトまたはすべてのプロジェクトに関連付けることにより、接続アプリを介して埋め込むことができるコンテンツを指定できます。1 つのプロジェクトを指定した場合、選択したプロジェクトのコンテンツのみを接続済みアプリを介して埋め込むことができます。

接続済みアプリのワークフロー

次の図は、外部アプリケーション (Web サーバーと Web ページ) と接続済みアプリ間の認証のしくみを示しています。

  1. ユーザーが Web ページにアクセスします: ユーザーが Web ページに埋め込まれたコンテンツにアクセスすると、Web ページが外部アプリケーションに GET 要求を送信し、その Web ページの HTML を取得します。
  2. 外部アプリケーションが認証トークンを構築します: 外部アプリケーションが JWT を作成します。この JWT には、接続アプリからのシークレット (追加の JWT 要件については以下のステップ 3 を参照) と、埋め込みコンテンツに対するユーザー アクセスの範囲が含まれます。シークレットは外部アプリケーションによって署名され、後のステップで信頼関係の検証に使用されます。
  3. 外部アプリケーションが認証トークンを使用して応答します: 外部アプリケーションが、Web ページによって呼び出された埋め込みコンテンツの URL に JWT が含まれているページに応答します。
  4. Web ページが Tableau のコンテンツを要求します: 埋め込みコンテンツを読み込むために、Web ページが埋め込みコンテンツの URL を呼び出し、Tableau に GET 要求が送信されます。
  5. Tableau がトークンを検証します: Tableau が JWT を受信し、接続済みアプリと JWT で使用される共有シークレットを識別して、外部アプリケーションとの信頼関係を検証します。次に、Tableau はユーザーのセッションを作成します。このセッションでは、JWT で定義された埋め込み範囲だけでなく、許可されたドメインやプロジェクトなど、接続済みアプリで指定された制限も考慮されます。
  6. Tableau が、埋め込みの制限付きコンテキストに基づいてコンテンツを返します: 埋め込みコンテンツは、ページが許可されたドメインの下にあり、かつ、コンテンツが許可されたプロジェクトにパブリッシュされている場合にのみ読み込まれます (該当する場合)。認証されたユーザーは、JWT で定義された範囲で埋め込みコンテンツを操作できます。

接続済みアプリの作成

ステップ1: 接続済みアプリを作成する

Tableau Server の [設定] ページから接続済みアプリを作成します。

  1. サーバー管理者として、Tableau Server にサインインします。

  2. 左側のペインで、[設定] > [接続済みアプリ] を選択し、[New Connected App (新しい接続済みアプリ)] ボタンをクリックします。

  3. [接続済みアプリの作成] ダイアログ ボックスで、次のいずれかの手順を行います。
    1. REST API 認可ワークフローの場合 (認証に REST API を使用するメタデータ API ワークフローを含みます)、[接続済みアプリ名] テキスト ボックスに接続済みアプリ名を入力し、[作成] ボタンをクリックします。

      注: REST API とメタデータ API の認可用に接続済みアプリを構成する場合は、アクセス レベルドメイン許可リストを無視できます。

    2. 埋め込みのワークフローの場合、次の手順を実行します。

      1. [接続済みアプリ名] テキスト ボックスに、接続済みアプリ名を入力します。

      2. [適用先] ドロップダウン メニューから、[すべてのプロジェクト] または [1 つのプロジェクトのみ] を選択して、埋め込むことができるビューまたはメトリクスを制御します。[1 つのプロジェクトのみ] オプションを選択した場合は、スコープを設定する特定のプロジェクトを選択します。これらの 2つ のオプションの詳細については、「アクセス レベル (埋め込みのワークフローのみ)」を参照してください。

        注:

      3. ドメイン許可リストで、以下の「ドメインの書式設定」に記載されているルールを使用してドメインを指定し、ビューまたはメトリクスを埋め込むことができる場所を制御します。

      4. 完了したら、[作成] ボタンをクリックします。

  4. 接続済みアプリ名の横にあるアクション メニューをクリックし、[有効] を選択します。セキュリティ上の理由から、接続済みアプリは作成時に既定で無効に設定されています。

  5. 接続済みアプリ ID (クライアント ID とも呼ばれます) をメモして、以下のステップ 3 で使用します。

ステップ 2: シークレットを生成する

接続済みアプリごとに合計 2 つのシークレットを生成できます。2 番目のシークレットは、シークレットのローテーションの目的で使用し、シークレットが侵害された場合の問題からシークレットを保護することができます。

  1. ステップ 1 で作成した接続済みアプリの詳細ページで、[Generate New Secret (新しいシークレットの生成)] ボタンをクリックします。

  2. 以下のステップ 3 で使用するシークレット ID とシークレット値をメモします。

ステップ 3: JWT を構成する

シークレットを生成したら、外部アプリケーションから有効な JWT を送信できるようにします。JWT は、2 者間で情報を安全に転送するために使用される標準規格です。JWT は、Tableau Server に情報を安全に送信するために、外部アプリケーションによって署名されています。JWT は、接続済みアプリ、セッションが生成されるユーザー、およびユーザーが持つ必要があるアクセス レベルを参照します。

有効な JWT には、次の情報が含まれます。

  • ステップ 1 の接続済みアプリ ID (クライアント ID とも呼ばれます)
  • ステップ 2 で生成されたシークレット ID とシークレット値

  • 登録されたクレームとヘッダー:

    クレーム名前説明または必要な値
    "kid"シークレット ID必須 (ヘッダー内)接続済みアプリのシークレット ID
    "iss"発行者必須 (ヘッダー内)信頼できる接続済みアプリとその署名キーを識別する一意の発行元 URI
    "alg"アルゴリズム必須 (ヘッダー内)JWT 署名アルゴリズム。HS256 のみがサポートされています。
    "sub"サブジェクト認証された Tableau Server ユーザーのユーザー名
    "aud"オーディエンス値は "tableau" である必要があります。
    "exp"有効期限

    JWT の有効期限が切れないようにする必要があります。JWT の有効期限は、設定された最大有効期間の範囲内である必要があります。この最大有効期間は、Tableau サービス マネージャーの vizportal.oauth.connected_apps.max_expiration_period_in_minutes コマンドを使用して構成できます。

    "jti"JWT IDクレームとして必要です。JWT ID クレームは、JWT に一意の識別子を提供し、大文字と小文字を区別します。
    "scp"

    重要: "scope" は使用しないでください。

    範囲埋め込みのワークフローの場合、サポートされる値は次のとおりです。

    "tableau:views:embed"
    "tableau:views:embed_authoring " (Tableau Server 2022.3 で追加)
    "tableau:metrics:embed" (Tableau Server 2023.3 で廃止)
    "tableau:ask_data:embed" (Tableau Server バージョン 2023.1 で追加)

    注:

    • 値はリスト型として渡す必要があります。
    • tableau:views:embed の場合、この範囲は、Tableau Server で既に構成されているユーザーのパーミッションを考慮し、元のビューで使用可能な場合は、ユーザーが埋め込みビューのツールを操作できるようにします。
    • 埋め込みコードでは、ツールバー パラメーターを除外することをお勧めします。詳細については、以下の「既知の問題 (埋め込みのワークフローのみ)」を参照してください。

    REST API 承認ワークフローの場合は、「JWT 認可をサポートする REST API メソッド」を参照してください。

    認証に REST API を使用するメタデータ API ワークフローの場合、サポートしているスコープは tableau:content:read のみです。

JWT の例

以下に、Java 言語と Python 言語の両方の JWT の 例を示します。Java と Python の例では、それぞれ nimbus-jose-jwt ライブラリと PyJWT ライブラリを使用しています。

Java

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.*;
import com.nimbusds.jwt.*;

import java.util.*;

...
				
String secret = "secretvalue";
	String kid = "connectedAppSecretId";
	String clientId = "connectedAppClientId";
	List<String> scopes = new
ArrayList<>(Arrays.asList("tableau:views:embed"));
	String username = "username";
	JWSSigner signer = new MACSigner(secret);
	JWSHeader header = new
JWSHeader.Builder(JWSAlgorithm.HS256).keyID(kid).customParam("iss", clientId).build();
	JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
		.issuer(clientId)
		.expirationTime(new Date(new Date().getTime() + 60 * 1000)) //expires in 1 minute
		.jwtID(UUID.randomUUID().toString())
		.audience("tableau")
		.subject(username)
		.claim("scp", scopes)
		.build();
	SignedJWT signedJWT = new SignedJWT(header, claimsSet);
	signedJWT.sign(signer);
	model.addAttribute("token", signedJWT.serialize());

Python

import jwt
token = jwt.encode(
	{
		"iss": connectedAppClientId,
		"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=5),
		"jti": str(uuid.uuid4()),
		"aud": "tableau",
		"sub": user,
		"scp": ["tableau:views:embed", "tableau:metrics:embed"]
	},
		connectedAppSecretKey,
		algorithm = "HS256",
		headers = {
		'kid': connectedAppSecretId,
		'iss': connectedAppClientId
        }
  )

JWT を構成した後、外部アプリケーションでコードを実行すると、トークンが生成されます。

ステップ 4: 次のステップ

埋め込みのワークフローの場合

JWT を構成したら、埋め込みコードを外部アプリケーションに追加する必要があります。外部アプリケーションが呼び出す Web コンポーネントに、上記のステップ 3 で構成した有効な JWT が含まれていることを確認します。

Tableau コンテンツの埋め込みの詳細については、次のいずれかまたは両方を参照してください。

注: 埋め込みコンテンツにアクセスするユーザーを正常に認証するには、ブラウザーがサードパーティーの Cookie を許可するように設定されている必要があります。

REST API 認証ワークフローの場合

JWT を構成したら、認証アクセスのために、有効な JWT を REST API サインイン要求に追加する必要があります。詳細については、「接続済みアプリのアクセス スコープ」を参照してください。

メタデータ API ワークフローの場合

JWT を構成したら、有効な JWT を REST API サインイン要求に追加する必要があります。詳細については、「接続済みアプリのアクセス スコープ」を参照してください。

接続済みアプリの管理

[接続済みアプリ] ページでは、サイトのすべての接続済みアプリを管理できます。接続済みアプリの作成、削除、無効化などのタスクを実行できるほか、既存のシークレットが侵害されている場合は、新しいシークレットを取り消したり、生成したりすることができます。

  1. サーバー管理者またはサイト管理者として、Tableau Server にサインインします。

  2. 左側のペインから、[設定] > [接続済みアプリ] の順に選択します。

  3. 管理する接続済みアプリの横にあるチェック ボックスを選択し、次のいずれか 1 つまたは複数の操作を実行します。

    • 組織のセキュリティ ポリシーで指定されたローテーション タイムラインに従って、新しいシークレットを生成します。追加のシークレットを生成するには、接続済みアプリの名前をクリックしてから、[Generate New Secret (新しいシークレットの生成)] ボタンをクリックします。接続済みアプリは、最大 2 つのシークレットを持つことができます。両方のシークレットは同時にアクティブにすることができ、有効期限はなく、削除されるまで有効です。

    • 接続済みアプリの名前をクリックして接続済みアプリの詳細を表示し、接続済みアプリの作成日、ID、プロジェクトとドメインの範囲、およびシークレットを確認します。

    • プロジェクトの範囲またはドメインを変更し、[アクション] メニューで [編集] を選択します。変更を加えて、[更新] をクリックします。

      注: プロジェクトまたはドメインの範囲を変更していて、埋め込みコンテンツが新しいプロジェクトまたは新しいドメインのいずれにも存在しない場合は、埋め込みビューまたはメトリクスを表示することができなくなるため、ユーザーが埋め込みコンテンツにアクセスするとエラーが表示されます。

    • 接続済みアプリの名前をクリックして、シークレットを削除します。接続済みアプリのページで、シークレットの横にある [アクション] をクリックし、[削除] を選択します。確認ダイアログ ボックスで、もう一度 [削除] を選択します。

      注: 接続済みアプリのシークレットが外部アプリケーションで使用されている場合、シークレットを削除すると、埋め込みビューやメトリクスを表示できなくなります。詳細については、以下の「接続済みアプリの無効化と削除、およびシークレットの削除による影響」を参照してください。

    • 接続済みアプリを無効にし、[アクション] メニューで [無効] を選択します。接続済みアプリが外部アプリケーションで使用されている場合、接続済みアプリを無効にすると、埋め込みビューやメトリクスを表示できなくなります。詳細については、以下の「接続済みアプリの無効化と削除、およびシークレットの削除による影響」を参照してください。

接続済みアプリの無効化と削除、およびシークレットの削除による影響

接続済みアプリを介してユーザーに埋め込みビューまたはメトリクスを表示するには、接続済みアプリを有効にしてシークレットを生成する必要があります。接続済みアプリが外部アプリケーションで使用されていて、無効化または削除されているか、そのシークレットが削除または置換されている場合、ユーザーが埋め込みコンテンツにアクセスするとエラーが発生します。

この問題を回避するには、接続済みアプリが有効になっていて、JWT で正しいシークレット ID と値が使用されていることを確認します。

アクセス レベル (埋め込みのワークフローのみ)

接続済みアプリのアクセス レベルを構成する際は、次の 2 つのプロジェクト タイプのうちいずれかを選択できます。アクセス レベルは、どのコンテンツを埋め込むことができるかを制御します。

  • すべてのプロジェクト: このオプションを使用すると、すべてのプロジェクトのコンテンツを埋め込むことができます。
  • 1 つのプロジェクトのみ: このオプションを使用すると、指定されたプロジェクト内のコンテンツのみを埋め込むことができます。指定したプロジェクトにネストされたプロジェクトが含まれている場合、そのネストされたプロジェクトにコンテンツを埋め込むことはできません。

ドメイン許可リスト ルール (埋め込みのワークフローのみ)

接続済みアプリのドメイン許可リストを使用すると、埋め込まれた Tableau コンテンツへのアクセスをすべてのドメインまたは一部のドメインに制限するか、一部のドメインを除外するか、またはすべてのドメインをブロックすることができます。

ドメイン オプション

接続済みアプリのドメイン許可リストを構成する際は、次の 2 つのオプションのいずれかを選択できます。

  • すべてのドメイン: 既定のオプションとして、このオプションは埋め込みコンテンツへの無制限のアクセスを有効にします。
  • 特定のドメインのみ: このオプションを使用すると、埋め込みコンテンツへのアクセスの範囲を限定できます。このオプションを使用する場合は、次のセクション「ドメインの書式設定」指定されている書式設定ルールに従ってください。

ドメインの書式設定

[domain allowlist (ドメイン許可リスト)] テキスト ボックスには、以下の書式設定の例を使用して、1 つまたは複数のドメインを入力することができます。

注: ドメインの書式設定のルールは、Tableau REST API で接続済みアプリのメソッド(新しいウィンドウでリンクが開く)を使用する場合にも適用されます。

一般的なシナリオに基づく書式設定の例をいくつか示します。

指定する内容埋め込みへのアクセス
ドメインの範囲*.myco.com埋め込みコンテンツには、myco.com のすべてのサブドメインからアクセスできます。
すべてのポートmyco.com:*埋め込みコンテンツには、myco.com のすべてのポートからアクセスできます。
特定のポートmyco.com:8080埋め込みコンテンツには、myco.com のポート 8080 からのみアクセスできます。
複数の個別のドメインmyco.com
events.myco.com
ops.myco.com

埋め込みコンテンツには、3 つのすべてのドメインからアクセスできます。

注: 複数のドメインを指定するときは、各ドメインを新しい行に入力するか、ドメインをスペースで区切ってください。REST API の場合は、ドメインをスペースで区切る必要があります。

セキュアなトラフィックのみhttps:埋め込みコンテンツには、ドメインに関係なく、安全にアクセスできます。
ドメインの範囲のすべてのポートへのセキュアなトラフィックhttps:*myco.com:*埋め込みコンテンツには、myco.com のすべてのサブドメインのすべてのポートから安全にアクセスできます。
ドメインなし[ドメインなし]埋め込みコンテンツへのアクセスはブロックされます。

既知の問題 (埋め込みのワークフローのみ)

接続済みアプリの使用にはいくつかの既知の問題がありますが、これらは今後のリリースで対処される予定です。

  • ツールバー機能: 埋め込みコンテンツにツールバーのパラメーターが定義されている場合、すべてのツールバー機能が動作するとは限りません。この問題を回避するには、次の例のようにツールバーのパラメーターを非表示にすることをお勧めします。

    <tableau-viz id='tab-viz' src='https://<your_server>/t/<your_site>/...'
    	toolbar='hidden'>
    </tableau-viz>

  • パブリッシュされたデータ ソース: データベースの認証資格情報の入力を求める [ユーザーにメッセージを表示] が設定されているパブリッシュされたデータ ソースは表示されません。この問題を回避するには、可能であれば、データ ソースの所有者がデータベースの認証資格情報を埋め込むことをお勧めします。
  • 埋め込みダッシュボードの「データに聞く」オブジェクト: 埋め込みダッシュボードの「データに聞く」オブジェクトは読み込まれません。(Tableau Server 2024.2 では「データに聞く」は廃止されます。)

  • メトリクスとドメイン許可リスト: 接続済みアプリのドメイン許可リストでアクセス制限が指定されているかどうかにかかわらず、埋め込みメトリクスのビューが表示されます。注: 埋め込みビューのツールバーからアクセスされるメトリクス データは、期待どおりに機能します。( Tableau Server 2023.3 で、Tableau はメトリクスを埋め込む機能を廃止しました。)

フィードバックをありがとうございます。フィードバックは正常に送信されました。ありがとうございます!