示例 – 使用 OAuth 进行外部访问

本主题提供了一个示例,介绍如何使用引用来允许提供商授予对 Snowflake 外部端点的访问权限。此示例使用 OAuth2 密钥和外部访问集成来允许访问。

向清单文件中添加引用

若要使用 OAuth 启用对外部端点的访问,提供商可以在 manifest.yml 文件中添加以下条目:

  • 具有 USAGE 权限的 EXTERNAL ACCESS INTEGRATION 引用

  • 具有 READ 权限的 SECRET 引用

以下示例 manifest.yml 文件显示了如何定义这些引用:

manifest_version: 1
configuration:
  log_level: warn
  trace_level: off
...
references:
  - consumer_secret:
      label: "Consumer's Secret"
      description: "Needed to authenticate with xyz.com"
      privileges:
        - READ
      object_type: SECRET
      register_callback: config.register_my_secret
      configuration_callback: config.get_config_for_ref
  - consumer_external_access:
      label: "Default External Access Integration"
      description: "This is required to access xyz.com"
      privileges:
        - USAGE
      object_type: EXTERNAL ACCESS INTEGRATION
      register_callback: config.register_reference
      configuration_callback: config.get_config_for_ref
      required_at_setup: true
Copy

备注

不能将这些引用的 multi_valued 属性设置为 true。

对密钥和外部访问对象的引用也需要在安装脚本中使用 configuration_callback 函数。有关更多信息,请参阅 向安装脚本中添加 configuration_callback 函数

向安装脚本中添加 configuration_callback 函数

在为密钥和外部访问集成添加引用之后,必须向安装脚本中添加 configuration_callback 函数。要创建外部访问集成或密钥,应用程序必须能够确定主机端口、密钥类型、OAuth 授权和令牌端点等的值。configuration_callback 将此信息从使用者账户提供给应用程序。

Snowsight 运行此回调过程,以填充提示用户配置对象的配置对话框。该过程需要被授予应用程序角色才能执行。

备注

configuration_callback 仅支持外部访问集成和密钥对象。

回调函数具有以下要求:

  • 回调函数必须接受包含引用名称的实参。这样可使同一个回调函数处理多个引用。

  • 回调函数必须返回格式正确的 JSON 对象。JSON 对象包含以下属性:

    • type

      指示消息的类型。有效值为:

      • CONFIGURATION:返回一个有效负载,其中包含基于对象类型的对象配置值。

      • ERROR:返回一个错误,其中包含 Snowsight 中显示的相关消息。

    • payload

      包含基于 type 属性值和所配置的对象类型的响应内容。

配置回调的签名如下:

CREATE OR REPLACE PROCEDURE configuration_callback_name(ref_name string)
RETURNS STRING
language <language>
as
$$
  ...
$$
Copy

在安装脚本中,必须向用于配置应用程序的应用程序角色授予 USAGE 权限,以便它们有权调用存储过程。以下示例显示如何对存储过程授予 USAGE 权限:

GRANT USAGE ON PROCEDURE configuration_callback_name(string)
  TO APPLICATION ROLE app_role;
Copy

回调函数会返回 JSON 对象。有关更多信息,请参阅 配置回调响应的 JSON 格式

以下示例显示用于处理外部访问和密钥引用的典型回调函数。

此函数执行以下操作:

  • 对于外部访问集成的引用,该过程返回一个包含所需配置信息的 JSON 对象。有关更多信息,请参阅 外部访问集成的 JSON 格式

  • 对于密钥的引用,该过程返回一个 JSON 对象,其中包含 OAuth2 类型的密钥配置。有关更多信息,请参阅 密钥引用的 JSON 格式

  CREATE OR REPLACE PROCEDURE config.get_config_for_ref(ref_name STRING)
    RETURNS STRING
    LANGUAGE SQL
    AS
    $$
    BEGIN
      CASE (ref_name)
        WHEN 'CONSUMER_EXTERNAL_ACCESS' THEN
          RETURN '{
            "type": "CONFIGURATION",
            "payload":{
              "host_ports":["google.com"],
              "allowed_secrets" : "LIST",
              "secret_references":["CONSUMER_SECRET"]}}';
        WHEN 'CONSUMER_SECRET' THEN
          RETURN '{
            "type": "CONFIGURATION",
            "payload":{
              "type" : "OAUTH2",
              "security_integration": {
                "oauth_scopes": ["https://www.googleapis.com/auth/analytics.readonly"],
                "oauth_token_endpoint": "https://oauth2.googleapis.com/token",
                "oauth_authorization_endpoint":
                    "https://accounts.google.com/o/oauth2/auth"}}}';
  END CASE;
  RETURN '';
  END;
  $$;

GRANT USAGE ON PROCEDURE config.get_config_for_ref(string)
  TO APPLICATION ROLE app_admin;
Copy

将 Python Permission SDK 用于密钥和外部访问集成

Python Permission SDK 支持密钥和外部访问集成对象。但是,这些对象的行为略有不同。

当提供商调用 permission.request_reference() 并传递 object_type 值为 SECRETEXTERNAL ACCESS INTEGRATION 的引用的名称时,Snowsight 会自动执行以下操作:

  • 调用安装脚本中的 configuration_callback 函数。

  • 验证 configuration_callback 函数返回的值。

  • 向使用者显示配置对话框。

备注

如果提供商在配置外部访问集成时,payload.allow_secrets 属性设置为 LIST,则无需单独调用来请求密钥引用。密钥配置隐式地包含在外部访问集成配置中。

语言: 中文