Tableau Server のバージョン 2022.1 以降、からは、Tableau 接続済みアプリを使用すると、Tableau Server サイトと Tableau コンテンツが埋め込まれているカスタム アプリケーションとの間に明示的な信頼関係を構築できるため、シームレスで安全な認証エクスペリエンスを実現できます。

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

  • 埋め込み可能なコンテンツへのアクセス、およびそのコンテンツを埋め込みできる場所へのアクセスを制限する
  • ユーザーは、アイデンティティ プロバイダー (IdP) と統合しなくても、シングルサインオン (SSO) を使用して埋め込みコンテンツにアクセスできる
  • ユーザーは、カスタム アプリケーションから直接認証できる

注:

  • Tableau Server の UI なしの接続アプリ機能は、Tableau REST API の接続済みアプリのメソッド(新しいウィンドウでリンクが開く)を介して Tableau Server バージョン 2021.4 で使用できるようになりました。
  • 接続済みアプリを介した埋め込みを有効にするには、HTTP トラフィックに対して SSL を使用するように Tableau Server を構成する必要があります。
  • Tableau 接続済みアプリと Salesforce 接続済みアプリは異なり、提供されている機能も異なります。現在、Tableau 接続済みアプリは、カスタム アプリケーションに Tableau ビューとメトリクスを埋め込めるように最適化されています。

注: EC2 インスタンスなどのコンテナで接続済みアプリを実行している場合、セッション トークンを有効にするには、コンテナとホストの両方の時計が UTC に設定されている必要があります。いずれかの時計が異なる規格を使用している場合、接続済みアプリは信頼されません。

接続済みアプリのしくみ

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. [Create Connected App (接続済みアプリの作成)] ダイアログ ボックスで、次の手順を行います。
    1. [Connected app name (接続済みアプリ名)] テキスト ボックスに、接続済みアプリ名を入力します。

    2. [適用先] ドロップダウン メニューから、[すべてのプロジェクト] または [1 つのプロジェクトのみ] を選択して、埋め込むことができるビューまたはメトリクスを制御します。[1 つのプロジェクトのみ] オプションを選択した場合は、スコープを設定する特定のプロジェクトを選択します。

    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" (範囲)

    サポートされている値には以下が含まれます。

    "tableau:views:embed"
    "tableau:metrics:embed"

    注:

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

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 を許可するか、パーティション ストレージを使用するように設定されている必要があります。

接続済みアプリの管理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ドメイン許可リストのルール

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

ドメイン オプション

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

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

ドメインの書式設定

[domain allowlist (ドメイン許可リスト)] テキスト ボックスには、1 つのドメインまたは複数のドメインを入力するか、何も入力しないままにすることもできます。ドメイン許可リストでは、CSP (コンテンツ セキュリティポリシー) フレームワークの frame-ancestors ヘッダー(新しいウィンドウでリンクが開く) で許可されているすべての書式設定が考慮されています。

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

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

指定する内容 埋め込みへのアクセス
ドメインの範囲 *.myco.com 埋め込みコンテンツには、myco.com のすべてのサブドメインからアクセスできます。
複数の個別のドメイン myco.com
events.myco.com
ops.myco.com
埋め込みコンテンツには、3 つのすべてのドメインからアクセスできます。
ドメインなし [ドメインなし] 埋め込みコンテンツへのアクセスはブロックされます。

既知の問題

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

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

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

  • パブリッシュされたデータ ソース: データベースの認証資格情報の入力を求める [ユーザーにメッセージを表示] が設定されているパブリッシュされたデータ ソースは表示されません。この問題を回避するには、可能であれば、データ ソースの所有者がデータベースの認証資格情報を埋め込むことをお勧めします。
ありがとうございます!