為 Snowflake 設定外部 OAuth:用戶端認證流程

OAuth 用戶端認證驗證可實現與 Snowflake 的機器對機器連線,

無需使用者互動。此方法非常適合於:

  • 用於自動資料重新整理的服務帳戶

  • 排程的擷取作業

  • CI/CD 管道

  • 需要內嵌認證的已發佈資料來源

與標準 OAuth(使用授權碼流程)不同,用戶端認證流程不會

提示使用者登入。相反,Tableau 會使用

用戶端 ID 和密碼直接向您的身分提供程式進行驗證。

附註:用戶端認證流程需要 Snowflake 的外部 OAuth 功能以及支援的身分提供程式。這與 Snowflake 的原生 OAuth 不同。

開始之前

要將 OAuth 用戶端認證用於 Snowflake,您需要:

需求描述
身分提供程式為用戶端認證授與設定的 Okta、Azure AD 或 Ping Federate
Snowflake 帳戶具有 ACCOUNTADMIN 存取權限的 Enterprise 版本或更高版本
OAuth 應用程式API 服務 (Okta)、應用程式註冊 (Azure AD) 或同等功能
自訂範圍Snowflake 角色指派的範圍(例如,「session:role:SYSADMIN」)

設定身分提供程式

以下步驟使用 Okta 作為範例。對於其他提供者,請參閱其文件,以瞭解用戶端認證設定。

步驟 1:建立 API 服務應用程式

  1. 登入 Okta 管理員主控台。

  2. 前往 **應用程式 > 應用程式

  3. 選取 **建立應用程式整合

  4. 選擇 **API 服務**,並選取 **下一個

  5. 輸入應用程式名稱(例如,snowflake-tableau-service)。

  6. 選取儲存

  7. 複製用戶端 ID用戶端密碼。稍後您將需要這些值。

步驟 2:停用 DPoP(若已啟用)

必須為用戶端認證流程停用出示持有證明 (DPoP)。

  1. 在應用程式設定中,前往一般 > 用戶端認證

  2. 清除權杖請求中需要出示持有證明 (DPoP) 標頭核取方塊。

  3. 選取儲存

步驟 3:新增自訂範圍

Snowflake 需要自訂範圍才能將角色指派給經過驗證的工作階段。

  1. 前往安全性 > API > 授權伺服器

  2. 選取預設授權伺服器(或您的自訂伺服器)。

  3. 選取範圍索引標籤,然後新增範圍

  4. 新增以下範圍:

    範圍名稱描述
    SnowflakeSnowflake 的一般存取範圍
    session:role:SYSADMIN指派 SYSADMIN 角色(根據您的角色進行調整)

    附註:為服務帳戶所需的任何其他角色建立其他範圍。

步驟 4:設定存取原則

  1. 選取存取原則索引標籤。

  2. 選取現有原則或建立新原則。

  3. 新增具有以下設定的規則:

    • 授與類型:用戶端認證

    • 範圍:任何範圍(或選取特定範圍)

  4. 選取建立規則儲存

設定 Snowflake

以 ACCOUNTADMIN 身分在 Snowflake 中執行以下 SQL 陳述式。將預留位置值取代為您的設定。

步驟 1:建立外部 OAuth 整合

USE ROLE ACCOUNTADMIN;

CREATE OR REPLACE SECURITY INTEGRATION okta_oauth_integration
  TYPE = EXTERNAL_OAUTH
  ENABLED = TRUE
  EXTERNAL_OAUTH_TYPE = OKTA
  EXTERNAL_OAUTH_ISSUER = 'https://<your-okta-domain>.okta.com/oauth2/default'
  EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://<your-okta-domain>.okta.com/oauth2/
default/v1/keys'
  EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'sub'
  EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name'
  EXTERNAL_OAUTH_AUDIENCE_LIST = ('api://default', 'snowflake')
EXTERNAL_OAUTH_ANY_ROLE_MODE = 'ENABLE';
參數描述
EXTERNAL_OAUTH_TYPE您的身分提供程式:OKTAAZUREPING_FEDERATE
EXTERNAL_OAUTH_ISSUER授權伺服器中的簽發者 URL
EXTERNAL_OAUTH_JWS_KEYS_URL用於權杖驗證的 JWKS 端點
EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLA IM識別使用者的 JWT 宣告。對於 Okta,使用 sub
EXTERNAL_OAUTH_ANY_ROLE_MODE設定為 ENABLE,以允許透過範圍指派角色

步驟 2:建立服務使用者

建立一個 Snowflake 使用者,其 LOGIN_NAME 與 OAuth 用戶端 ID 相符。

CREATE USER IF NOT EXISTS service_account_user
LOGIN_NAME = '<your-okta-client-id>'
DISPLAY_NAME = 'OAuth Service Account'
MUST_CHANGE_PASSWORD = FALSE
DISABLED = FALSE;
-- Grant role to the service user
GRANT ROLE SYSADMIN TO USER service_account_user;
-- Set the default role
ALTER USER service_account_user SET DEFAULT_ROLE = 'SYSADMIN';
-- Grant warehouse access
GRANT USAGE ON WAREHOUSE <your-warehouse> TO USER service_account_user;
-- Grant database and schema access
GRANT USAGE ON DATABASE <your-database> TO USER service_account_user;
GRANT USAGE ON SCHEMA <your-database>.<your-schema> TO USER
service_account_user;
GRANT SELECT ON ALL TABLES IN SCHEMA <your-database>.<your-schema> TO USER
service_account_user;

重要提示:LOGIN_NAME 必須與 OAuth 權杖中的 sub 宣告完全相符。對於 Okta API 服務應用程式,此為用戶端 ID。

從 Tableau Desktop 連線

  1. 在 Tableau Desktop 中,選取連線 > Snowflake

  2. 輸入連線詳細資訊:

    欄位
    伺服器您的 Snowflake 帳戶 URL(例如,account.snowflakecomputing.com
    角色要使用的角色(例如,SYSADMIN
    倉儲您的 Snowflake 倉儲
    驗證OAuth 用戶端認證
  3. 輸入 OAuth 設定:

    欄位
    OAuth 權杖請求 URLhttps://<your-okta-domain>.okta.com/oauth2/default/ v1/token
    使用者名稱您的 OAuth 用戶端 ID
    密碼您的 OAuth 用戶端密碼
    OAuth 範圍snowflake session:role:SYSADMIN

    附註:OAuth 範圍必須包含為角色指派設定的任何自訂範圍。

  4. 選取「登入」

發佈到 Tableau Cloud 或 Tableau Server

發佈使用 OAuth 用戶端認證的工作簿或資料來源時:

  1. 發佈對話方塊中,選取資料來源旁的編輯

  2. 對於驗證,選取內嵌密碼

  3. 用戶端認證內嵌在已發佈內容中。

重要提示:與標準 OAuth 不同,用戶端認證被視為內嵌密碼。存取已發佈內容的使用者會使用服務帳戶認證,而不是他們自己的身分。

認證變換

OAuth 用戶端密碼變換時,請在 Tableau Cloud 上更新內嵌認證:

  1. 登入 Tableau Cloud。

  2. 瀏覽至已發佈資料來源。

  3. 選取連線

  4. 使用新的用戶端密碼更新連線。

對於自動變換,請使用 Tableau REST API 以程式設計方式更新連線認證。

常見問題

何時應使用 OAuth 用戶端認證,而不是標準 OAuth?

需要無人參與的機器對機器驗證時,請使用用戶端認證。標準

OAuth 需要使用者互動來進行初始登入和定期重新驗證。用戶端認證

使用服務帳戶身分,並且不需要使用者互動。

我可以將用戶端認證與 Snowflake 的原生 OAuth 一起使用嗎?

不可以。Snowflake 的原生 OAuth 僅支援授權碼流程。用戶端認證需要具有支援的身分提供程式(Okta、Azure AD 或 Ping Federate)的外部 OAuth。

如何處理已發佈內容的密碼變換?

OAuth 用戶端密碼變換時,必須在 Tableau Cloud 中更新內嵌認證。可以透過 Tableau Cloud UI 手動更新,也可以使用 Tableau REST API 以程式設計方式更新。請考慮自動化此流程,作為密碼變換工作流程的一部分。

為何即使已啟用 EXTERNAL_OAUTH_ANY_ROLE_MODE,我的連線仍會失敗並出現角色錯誤?

Snowflake 需要 OAuth 權杖中的角色資訊。將自訂範圍(例如,session:role:SYSADMIN)新增到授權伺服器,並在從 Tableau 連線時將其包含在 OAuth 範圍欄位中。

疑難排解

錯誤訊息原因解決方案
「使用者不存在或未經授權」Snowflake 使用者 LOGIN_NAME 與 OAuth 用戶端 ID 不相符設定使用者的 LOGIN_NAME,以符合 sub 宣告(Okta 的用戶端 ID)
「請求的角色未在存取權杖中列出」權杖中缺少角色範圍session:role:<ROLE> 範圍新增至授權伺服器,並將其包含在 OAuth 範圍中
「無效的 DPoP 證明」Okta 中已啟用 DPoP在 Okta 應用程式中停用「需要出示持有證明 (DPoP)」
「無效的範圍」未設定自訂範圍將所需範圍新增至授權伺服器;不包含 openid
權杖驗證失敗JWKS URL 或簽發者不正確驗證 EXTERNAL_OAUTH_JWS_KEYS _URLEXTERNAL_OAUTH_ISSUER 是否與授權伺服器相符

另請參閱

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