為 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 服務應用程式
登入 Okta 管理員主控台。
前往 **應用程式 > 應用程式。
選取 **建立應用程式整合。
選擇 **API 服務**,並選取 **下一個。
輸入應用程式名稱(例如,
snowflake-tableau-service)。選取儲存。
複製用戶端 ID 和用戶端密碼。稍後您將需要這些值。
步驟 2:停用 DPoP(若已啟用)
必須為用戶端認證流程停用出示持有證明 (DPoP)。
在應用程式設定中,前往一般 > 用戶端認證。
清除權杖請求中需要出示持有證明 (DPoP) 標頭核取方塊。
選取儲存。
步驟 3:新增自訂範圍
Snowflake 需要自訂範圍才能將角色指派給經過驗證的工作階段。
前往安全性 > API > 授權伺服器。
選取預設授權伺服器(或您的自訂伺服器)。
選取範圍索引標籤,然後新增範圍。
新增以下範圍:
範圍名稱 描述 Snowflake Snowflake 的一般存取範圍 session:role:SYSADMIN 指派 SYSADMIN 角色(根據您的角色進行調整) 附註:為服務帳戶所需的任何其他角色建立其他範圍。
步驟 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 | 您的身分提供程式:OKTA、AZURE 或 PING_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 連線
在 Tableau Desktop 中,選取連線 > Snowflake。
輸入連線詳細資訊:
欄位 值 伺服器 您的 Snowflake 帳戶 URL(例如, account.snowflakecomputing.com)角色 要使用的角色(例如, SYSADMIN)倉儲 您的 Snowflake 倉儲 驗證 OAuth 用戶端認證 輸入 OAuth 設定:
欄位 值 OAuth 權杖請求 URL https://<your-okta-domain>.okta.com/oauth2/default/ v1/token使用者名稱 您的 OAuth 用戶端 ID 密碼 您的 OAuth 用戶端密碼 OAuth 範圍 snowflake session:role:SYSADMIN附註:OAuth 範圍必須包含為角色指派設定的任何自訂範圍。
選取「登入」。
發佈到 Tableau Cloud 或 Tableau Server
發佈使用 OAuth 用戶端認證的工作簿或資料來源時:
在發佈對話方塊中,選取資料來源旁的編輯。
對於驗證,選取內嵌密碼。
用戶端認證內嵌在已發佈內容中。
重要提示:與標準 OAuth 不同,用戶端認證被視為內嵌密碼。存取已發佈內容的使用者會使用服務帳戶認證,而不是他們自己的身分。
認證變換
OAuth 用戶端密碼變換時,請在 Tableau Cloud 上更新內嵌認證:
登入 Tableau Cloud。
瀏覽至已發佈資料來源。
選取連線。
使用新的用戶端密碼更新連線。
對於自動變換,請使用 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
_URL 和 EXTERNAL_OAUTH_ISSUER 是否與授權伺服器相符 |
另請參閱
在 Tableau Server 上為 Snowflake 連線設定 OAuth(連結在新視窗開啟) - 瞭解使用 Snowflake 的標準 OAuth 驗證。
外部 OAuth 安全性整合(連結在新視窗開啟) - 用於設定外部 OAuth 提供者的 Snowflake 文件。
Okta 用戶端認證流程(連結在新視窗開啟) - 用於實作用戶端認證的 Okta 文件。
更新資料來源連線(連結在新視窗開啟) - 認證更新的 Tableau REST API 參考。
