設定 Tableau 已連線應用程式,以為內嵌內容啟用 SSO

從 Tableau Server 版本 2022.1 開始,從已連線 Tableau 的應用程式可透過協助 Tableau Server 站台與內嵌 Tableau 內容的外部應用程式之間建立明確的信任關係,從而實現無縫且安全的驗證體驗。在 Tableau Server 2022.3 中,Tableau 連線的應用程式將其功能擴展為支援 REST API 授權。且截至 Tableau Server 2023.3,透過已連線應用程式完成的 REST API 授權受中繼資料 API 支援。

已連線應用程式可提供以下功能:

  • 限制存取哪些內容可以內嵌,以及該內容可以內嵌的位置
  • 可讓使用者使用單一登入 (SSO) 存取內嵌內容,而無需與身分識別提供者 (IdP) 進行整合
  • 可讓使用者直接從外部應用程式進行驗證
  • 以編程方式授代表使用者透過 JSON Web 權杖 (JWT) 授權存取 Tableau REST API(以及 Tableau Server 2023.3 開始的中繼資料 API)

附註:

  • 在 Tableau Server 版本 2021.4 中,可透過 Tableau REST API 中的已連線應用程式方法(連結在新視窗開啟)使用無 UI 的已連線應用程式功能。
  • 要透過已連線應用程式啟用內嵌,必須將 Tableau Server 設定為使用 SSL 處理 HTTP 流量。
  • 為了讓工作階段權杖有效,外部應用程式和託管外部應用程式的伺服器的時鐘必須設定為國際標準時間 (UTC)。若任一時鐘使用不同的標準,則已連線應用程式將不受信任。
  • Tableau 已連線應用程式和 Salesforce 已連線應用程式不同,並且提供不同的功能。現在,Tableau 已連線應用程式已針對在外部應用程式中內嵌 Tableau 檢視和指標進行了最佳化。(2023 年 10 月,Tableau 已淘汰 Tableau CloudTableau Server 版本 2023.3 中內嵌指標的功能。)

已連線應用程式的工作原理

Tableau Server 站點和外部應用程式之間的信任關係透過 JSON Web 權杖 (JWT) 標準中的驗證權杖建立和進行驗證,該權杖使用由 Tableau 已連線應用程式提供並由外部應用程式簽署的共用密碼。

已連線應用程式的關鍵元件

已連線應用程式的以下元件與外部應用程式中的 JWT 共同作業,以驗證使用者並顯示內嵌的內容。

  • 祕密:祕密是 Tableau 和外部應用程式共用的金鑰。這些密碼會用於構成 JWT 的簽章。使用已連線應用程式進行內嵌驗證時需要密碼。密碼可以在已連線應用程式中建立,不會過期,並且在刪除之前一直有效。
  • 網域允許清單:可以在每個已連線應用程式中指定允許的網域清單。透過已連線應用程式內嵌的 Tableau 內容僅允許在指定的網域下使用。這有助於確保內容在企業保護和核准的網域下公開。
  • 存取層級:可以將已連線應用程式與一個或所有專案相關聯,以指定可以透過已連線應用程式內嵌哪些內容。若指定一個專案,則只能透過已連線應用程式內嵌所選專案中的內容。

已連線應用程式的工作流程

下圖說明了外部應用程式(Web 伺服器和網頁)和已連線應用程式之間如何進行驗證。

  1. 使用者瀏覽網頁:使用者瀏覽網頁上的內嵌內容時,網頁向外部應用程式傳送 GET 請求,以檢索該網頁上的 HTML。
  2. 外部應用程式建構驗證權杖:外部應用程式建構 JWT,其中包含來自已連線應用程式的密碼(有關其他的 JWT 要求,請參閱下面的步驟 3)以及使用者對內嵌內容的存取範圍。該密碼由外部應用程式簽署,並作為後續步驟中信任關係的驗證碼使用。
  3. 外部應用程式透過驗證權杖進行回應:外部應用程式透過網頁叫用的內嵌內容 URL 中的 JWT 回應頁面。
  4. 網頁從 Tableau 請求內容:嘗試載入內嵌內容時,網頁叫用內嵌內容的 URL,從而向 Tableau 傳送 GET 請求。
  5. Tableau 驗證權杖:Tableau 接收 JWT 並透過識別已連線應用程式和 JWT 中使用的共用密碼來驗證與外部應用程式的信任關係。然後 Tableau 為使用者建立工作階段。該工作階段不僅遵守 JWT 中定義的內嵌範圍,還遵守已連線應用程式中指定的限制,包括允許的網域和允許的專案。
  6. Tableau 根據受限制的內嵌內容傳回內容:內嵌內容僅在頁面位於允許的網域下並且內容已發佈到允許的專案(若適用)時載入。經過驗證的使用者只能根據 JWT 中定義的範圍與內嵌內容進行互動。

建立已連線應用程式

步驟 1:建立已連線應用程式

Tableau Server 的「設定」頁面建立已連線應用程式。

  1. 請作為伺服器管理員,登入Tableau Server

  2. 從左側窗格中,選取設定 > 已連線應用程式,然後按一下新建已連線應用程式按鈕。

  3. 在「建立已連線應用程式」對話方塊中,執行以下動作之一:
    1. 如果是 REST API 授權工作流程(包括使用 REST API 授權的中繼資料 API 工作流程),請在已連線應用程式名稱文本方塊中輸入已連線應用程式的名稱,然後按一下「建立」按鈕。

      附註:在為 REST API 與中繼資料 API 授權書ing已連線應用程式時,可以忽略「存取層級」「網域允許清單」

    2. 如果是嵌入工作流程,請執行以下動作:

      1. 在已連線應用程式名稱文字方塊中,輸入已連線應用程式的名稱。

      2. 在「套用到」下拉式功能表中,選取「所有專案」「僅一個專案」以控制可以內嵌哪些檢視。如果選取「僅一個專案」選項,請選取要確定範圍的具體專案。有關這兩個選項的更多資訊,請參閱存取層級(僅限嵌入工作流程)

        附註:

      3. 在網域允許清單中,使用下面網域格式設定中描述的規則指定網域,以控制可以內嵌檢視或指標的位置。

      4. 完成後,按一下建立按鈕。

  4. 在已連線應用程式名稱旁邊,按一下動作功能表並選取「啟用」。出於安全考慮,預設情況下,已連線應用程式在建立時會設定為停用。

  5. 記下已連線應用程式的 ID,也稱為用戶端 ID,以在下面的步驟 3 中使用。

步驟 2:產生密碼

可以為每個已連線應用程式產生總共兩個密碼。第二個密碼可用於變換密碼,有助於防止在密碼洩露時出現問題。

  1. 在步驟 1 中建立的已連線應用程式的詳細資訊頁面上,按一下產生新密碼按鈕。

  2. 記下密碼 ID 和密碼值,以在下面的步驟 3 中使用。

步驟 3:配置 JWT

產生祕密後,您希望可讓外部應用程式傳送有效的 JWT。JWT 是一項標準,用於在兩方之間安全地傳輸資訊。JWT 由外部應用程式簽署,以安全地將資訊傳送到 Tableau Server。JWT 會引用已連線應用程式、為其產生工作階段的使用者以及使用者應具有的存取層級。

有效的 JWT 包括以下資訊:

  • 已連線應用程式 ID,也稱為用戶端 ID,來自步驟 1
  • 步驟 2 中產生的密碼 ID 和密碼值

  • 註冊宣告和標頭:

    宣告名稱說明或所需值
    kid密碼 ID必需(在標頭中)。已連線應用程式密碼 ID。
    iss簽發者必需(在標頭中)。唯一簽發者 URI,標識受信任的已連線應用程式及其簽署金鑰。
    alg演算法必需(在標頭中)。JWT 簽署演算法。僅支援 HS256。
    sub主體經過驗證的 Tableau Server 使用者的使用者名稱。
    aud受眾值必須是:「tableau」。
    exp到期時間

    有效的 JWT 不得到期。JWT 的到期時間必須在配置的最大有效期限內。該可以使用 tsm 的vizportal.oauth.connected_apps.max_expiration_period_in_minutes命令配置最大有效期限。

    jtiJWT 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. 選中要管理的已連線應用程式旁邊的核取方塊,然後執行以下一項或多項動作:

    • 根據組織的安全性原則指定的變換時間線產生新密碼。要產生額外的密碼,請按一下已連線應用程式的名稱,然後按一下產生新密碼按鈕。一個已連線應用程式最多可以有兩個密碼。這兩個密碼可以同時處於使用中狀態,不會過期,並且在被刪除之前一直有效。

    • 透過按一下已連線應用程式的名稱檢閱已連線應用程式的詳細資訊,以查看已連線應用程式的建立時間、其 ID、專案和網域範圍及其密碼。

    • 變更專案範圍或網域,在動作功能表中,選取編輯。進行變更並按一下更新

      附註:若變更專案或網域範圍,並且新專案或新網域中不存在內嵌內容,則內嵌檢視或指標無法顯示,使用者在存取內嵌內容時會看到錯誤。

    • 透過按一下已連線應用程式的名稱刪除密碼。在已連線應用程式頁面上,按一下金鑰旁邊的動作並選取刪除。在確認對話方塊中,再次選取刪除

      附註:若外部應用程式正在使用已連線應用程式的密碼,則刪除該密碼後無法顯示內嵌檢視或指標。有關更多資訊,請參閱下方的停用或刪除已連線應用程式或刪除密碼的影響

    • 停用已連線應用程式,在動作功能表中,選取停用。若外部應用程式正在使用某個已連線應用程式,則停用已連線應用程式後無法顯示內嵌檢視或指標。有關更多資訊,請參閱下方的停用或刪除已連線應用程式或刪除密碼的影響

停用或刪除已連線應用程式或刪除密碼的影響

要透過已連線應用程式向使用者顯示內嵌檢視或指標,則需要啟用已連線應用程式並產生密碼。若外部自訂應用程式中正在使用已連線應用程式,停用或刪除該已連線應用程式,或刪除或取代其祕密後,使用者在存取內嵌內容時會遇到錯誤。

為避免此問題,請確保啟用已連線應用程式,並且 JWT 正在使用正確的密碼 ID 和值。

存取層級(僅限嵌入工作流程)

設定已連線應用程式的存取層級時,可以選取以下兩個專案之一:存取層級控制可以嵌入的內容。

  • 所有專案: 此選項啟用所有要嵌入專案中的內容。
  • 只有一個專案: 此選項僅啟用要嵌入的指定專案中的內容。如果指定的專案包含嵌套專案,則不會啟用在這些嵌套專案中嵌入內容。

網域允許清單規則(僅限嵌入工作流程)

已連線應用程式的網域允許清單可讓您將對內嵌 Tableau 內容的存取限制為所有網域或某些網域;或排除某些網域或封鎖所有網域。

網域選項

在設定已連線應用程式的網域允許清單時,可以選取以下兩個選項之一:

  • 所有網域:作為預設選項,此選項可啟用對內嵌內容的無限制存取。
  • 僅特定網域:此選項可讓您縮小對內嵌內容的存取範圍。若使用此選項,請遵循以下部分網域格式設定中指定的格式設定規則。

網域格式設定

在網域允許清單文字方塊中,可以使用以下格式範例輸入一或多個網域。

附註:在 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

可從所有三個網域存取內嵌內容。

附註:指定多個網域時,請逐行輸入每個網域,或使用空格將各個網域分開。對於 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 取消了內嵌指標功能。)

感謝您的意見反應!已成功提交您的意見回饋。謝謝!