使用直接信任設定已連線應用程式

從 從2022 年 1 月初開始,已連線 Tableau 的應用程式可透過協助 Tableau Cloud 站台與外部應用程式之間建立明確的信任關係,從而實現無縫且安全的驗證體驗。

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

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

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

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

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

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

附註:為了讓工作階段權杖有效,外部應用程式和託管外部應用程式的伺服器的時鐘必須設定為國際標準時間 (UTC)。若任一時鐘使用不同的標準,則已連線應用程式將不受信任。

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

連線的工作流程

下圖說明了外部應用程式(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 Cloud 的「設定」頁面建立已連線應用程式。

  1. 請作為站台管理員登入Tableau Cloud

  2. 從左窗格中,選取設定 > 已連線應用程式

  3. 按一下「新建已連線應用程式」 按鈕下拉箭頭,並選擇「直接信任」

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

      附註:在為已連線應用程式設定 REST API 驗證時,可以忽略「存取層級」「網域允許清單」

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

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

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

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

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

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

步驟 2:產生密碼

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

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

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

步驟 3:配置 JWT

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

有效的 JWT 包括以下資訊:

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

  • 註冊宣告和標頭:

    宣告名稱描述或所需值
    kid密碼 ID必需(在標頭中)。已連線應用程式的祕密金鑰識別碼。
    iss簽發者必需(在標頭中)。唯一簽發者 URI,標識受信任的已連線應用程式及其簽署金鑰。
    alg演算法必需(在標頭中)。JWT 簽署演算法。僅支援 HS256。
    sub主體經過驗證的 Tableau Cloud 使用者的使用者名稱(電子郵件地址)
    aud對象值必須是:「tableau」。
    exp到期時間有效的 JWT 不得到期。JWT 的過期時間(UTC 時間)必須在最長有效期內,即 10 分鐘。
    jtiJWT ID要求作為聲明。JWT ID 宣告為 JWT 提供唯一識別碼,並且區分大小寫。
    scp

    重要提示:請勿使用「scope」。

    範圍如果是嵌入工作流程,支援的值包括:

    tableau:views:embed
    tableau:views:embed_authoring
    tableau:metrics:embed
    tableau:ask_data:embed

    附註:

    • 值必須作為清單類型傳遞。
    • 如果是 tableau:views:embedtableau:views:embed_authoring,該範圍尊重已在 Tableau Cloud 設定的使用者權限,並允許使用者與內嵌檢視中的工具互動(若工具在原始檢視中可用)。
    • 我們建議內嵌程式碼排除工具列參數。有關詳情,請參閱下面的已知問題(僅限嵌入工作流程)

    有關 REST API 授權工作流程,請參閱支援 JWT 授權的 REST API 方法

    (使用者屬性)(使用者屬性值)

    僅用於內嵌工作流程

    可以在 JWT 中包含使用者屬性。然後,在內嵌內容中使用使用者屬性函數時,Tableau 會檢查經過驗證的使用者的內容,並決定哪些資料可以在執行時顯示。

    附註:

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 = "user@domain.com";
	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)
		.claim("Region", "East")
		.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"],
		"Region": "East"
	},
		connectedAppSecretKey,
		algorithm = "HS256",
		headers = {
		'kid': connectedAppSecretId,
		'iss': connectedAppClientId
        }
  )

設定 JWT 後,當程式碼由外部應用程式執行時,其將產生一個權杖。

步驟 4:後續步驟

對於內嵌工作流程

設定 JWT 後,必須向外部應用程式新增內嵌代碼。確保在外部應用程式叫用的 Web 元件中包含在上述步驟 3 中設定的有效 JWT。

有關內嵌 Tableau 內容的詳細資訊,請參閱以下一項或兩項:

附註:為了讓使用者在存取內嵌內容時成功進行驗證,必須將瀏覽器設定為允許協力廠商 Cookie。

對於 REST API 授權工作流程

設定 JWT 後,必須將有效的 JWT 新增到 REST API 登入請求以進行授權存取。有關詳細資訊,請參閱已連線應用程式的存取範圍

管理已連線應用程式

可以在「已連線應用程式」頁面上管理站點的所有已連線應用程式。可以執行建立、刪除和停用已連線應用程式等工作;若現有密碼已洩露,則可撤銷或產生新密碼。

  1. 請作為站台管理員登入Tableau Cloud

  2. 從左窗格中,選取設定 > 已連線應用程式

  3. 選中要管理的已連線應用程式旁邊的核取方塊,然後執行以下一項或多項動作:

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

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

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

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

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

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

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

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

要透過已連線應用程式向使用者顯示內嵌內容或者啟用 REST API 存取,則必須啟用已連線應用程式並產生密碼。若外部應用程式中一直使用的已連線應用程式已停用或刪除,或其祕密已被刪除或取代,使用者會遇到 403 錯誤 。

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

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

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

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

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

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

網域選項

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

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

網域格式設定

在網域允許清單文字方塊中,可以輸入一個網域、多個網域或不輸入任何網域。網域允許清單尊重 CSP(內容安全性原則)框架的 frame-ancestors 標頭(連結在新視窗開啟)允許的任何格式設定。

附註:在 Tableau REST API 中使用已連線應用程式方法(連結在新視窗開啟)時,網域格式設定規則同樣適用。

以下是一些基於常見情境的格式設定範例:

要指定...範例內嵌存取
網域範圍*.myco.com可以從 myco.com 下的所有子網域存取內嵌內容。
多個離散網域myco.com
events.myco.com
ops.myco.com
可從所有三個網域存取內嵌內容。
無網域[無網域]已封鎖存取內嵌內容。

已知問題(僅限嵌入工作流程)

使用已連線應用程式時存在一些已知問題,這些問題將在未來版本中解決。

  • 工具列功能:內嵌內容定義工具列參數時,並非所有工具列功能都可以使用。要解決此問題,我們建議如下方範例一樣隱藏工具列參數。

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

  • 已發佈資料來源:將不會顯示設定為提示使用者提供資料庫認證的已發佈資料來源。要盡可能解決此問題,我們建議資料來源所有者改為內嵌齊資料庫認證。
  • 內嵌儀表板中的「資料問答」物件:內嵌儀表板中的「資料問答」物件將不會載入。

  • 指標和網域允許清單:儘管可能在已連線應用程式的網域允許清單中指定了存取限制,但仍會顯示內嵌指標檢視。附註:從內嵌檢視的工具列中存取的指標資料將按預期工作。

感謝您的意見回饋!