为 Snowflake 配置外部 OAuth:客户端凭据流程

OAuth 客户端凭据身份验证支持与 Snowflake 的计算机对计算机连接

无需用户交互。此方法非常适合于:

  • 用于自动数据刷新的服务帐户

  • 计划的数据提取作业

  • CI/CD 管道

  • 需要嵌入式凭据的已发布数据源

与标准 OAuth(使用授权代码流程)不同,客户端凭据流程不会

提示用户登录。 相反,Tableau 使用客户端 ID 和密文直接向身份提供程序

进行身份验证。

注意:客户端凭据流程需要 Snowflake 的外部 OAuth 功能以及受支持的身份提供程序。这与 Snowflake 的本机 OAuth 不同。

开始之前

若要将 OAuth 客户端凭据与 Snowflake 结合使用,您需要:

要求描述
身份提供程序针对客户端凭据授予配置的 Okta、Azure AD 或 Ping Federate
Snowflake 帐户具有 ACCOUNTADMIN 访问权限的 Enterprise Edition 或更高版本
OAuth 应用程序API 服务 (Okta)、应用程序注册 (Azure AD) 或同等服务
自定义范围Snowflake 角色分配的范围(例如“session:role:SYSADMIN”)

配置您的身份提供程序

以下步骤使用 Okta 作为示例。对于其他提供程序,请查阅其文档以了解客户端凭据配置。

步骤 1:创建 API 服务应用程序

  1. 登录到 Okta 管理员控制台。

  2. 转到 **“Applications”(应用程序)>“Applications”(应用程序)。

  3. 选择 **“Create App Integration”(创建应用程序集成)。

  4. 选择 **“API Services”(API 服务)**, 并选择 **“Next”(下一步)。

  5. 输入应用程序名称(例如,snowflake-tableau-service)。

  6. 选择“Save”(保存)。

  7. 复制“Client ID”(客户端 ID)“Client Secret”(客户端密文)。稍后您将需要这些值。

步骤 2:禁用 DPoP(如果已启用)

必须为客户端凭据流程禁用所有权证明演示 (DPoP)。

  1. 在您的应用程序设置中,转到“General”(常规)>“Client Credentials”(客户端凭据)。

  2. 清除“Require Demonstrating Proof of Possession (DPoP) header in token requests”(在令牌请求中需要所有权证明演示 (DPoP) 标头)复选框。

  3. 选择“Save”(保存)。

步骤 3:添加自定义范围

Snowflake 需要自定义范围以将角色分配给经过身份验证的会话。

  1. 转到“Security”(安全性)>“API”>“Authorization Servers”(授权服务器)。

  2. 选择默认授权服务器(或您的自定义服务器)。

  3. 选择“Scopes”(范围)选项卡,然后选择“Add Scope”(添加范围)。

  4. 添加以下范围:

    范围名称描述
    snowflakeSnowflake 的一般访问范围
    session:role:SYSADMIN分配 SYSADMIN 角色(根据您的角色进行调整)

    注意:为服务帐户需要的任何其他角色创建其他范围。

步骤 4:配置访问策略

  1. 选择“Access Policies”(访问策略)选项卡。

  2. 选择现有策略或创建新策略。

  3. 添加具有以下设置的规则:

    • “Grant type”(授予类型):客户端凭据

    • “Scopes”(范围):任何范围(或选择特定范围)

  4. 选择“Create Rule”(创建规则)或“Save”(保存)。

配置 Snowflake

在 Snowflake 中以 ACCOUNTADMIN 身份运行以下 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 应用中禁用“Require Demonstrating Proof of Possession (DPoP)”(需要所有权证明演示 (DPoP))
“范围无效”未配置自定义范围将所需的范围添加到您的授权服务器;不包括 openid
令牌验证失败JWKS URL 或颁发者不正确验证 EXTERNAL_OAUTH_JWS_KEYS _URLEXTERNAL_OAUTH_ISSUER 是否与您的授权服务器匹配

另请参见

感谢您的反馈!您的反馈已成功提交。谢谢!