You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过AWS Cognito实现Snowflake OAuth2.0客户端凭证授权失败排查

问题解决步骤

1. 修正Cognito令牌受众(Audience)的匹配问题

你遇到的EXTERNAL_OAUTH_MISSING_AUDIENCE错误,核心原因是Cognito返回的access_token中的aud字段值,不在Snowflake安全集成配置的external_oauth_audience_list范围内。

对于AWS Cognito的客户端凭证流(Machine-to-Machine),默认返回的access_token的aud是应用客户端的client_id,而非你当前配置的Snowflake URL。你可以选择以下两种方案调整:

  • 方案A:调整Snowflake集成的受众列表
    修改安全集成,将Cognito应用客户端的client_id加入external_oauth_audience_list:
    CREATE OR REPLACE security integration TEST_OAUTH
      type = external_oauth
      enabled = true
      external_oauth_type = custom
      external_oauth_issuer = 'https://cognito-idp.us-east-1.amazonaws.com/us-east-<user_pool_id>'
      external_oauth_audience_list = ('<your_cognito_client_id>', 'https://<sf_subscription>.us-east-1.snowflakecomputing.com')
      external_oauth_token_user_mapping_claim = 'sub'
      EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://cognito-idp.us-east-1.amazonaws.com/us-east-<user_pool_id>/.well-known/jwks.json'
      external_oauth_snowflake_user_mapping_attribute = 'login_name'
      external_oauth_any_role_mode = 'ENABLE';
    
  • 方案B:配置Cognito返回包含Snowflake URL的受众
    在Cognito用户池中添加自定义资源服务器:
    1. 进入Cognito用户池 → 切换到“资源服务器”选项卡 → 点击“创建资源服务器”
    2. 填写“标识符”为你的Snowflake URL(https://<sf_subscription>.us-east-1.snowflakecomputing.com),并添加至少一个自定义范围(例如snowflake_access)
    3. 返回应用客户端设置页面,将刚才创建的自定义范围添加到“Allowed OAuth Scopes”中
    4. 请求access_token时,在scope参数中包含该自定义范围,此时返回的token会将Snowflake URL作为aud之一

2. 确保Snowflake用户与Cognito服务用户的映射正确

你配置的external_oauth_token_user_mapping_claim = 'sub'和external_oauth_snowflake_user_mapping_attribute = 'login_name'要求:

  • Snowflake中必须存在一个用户,其LOGIN_NAME完全等于Cognito服务用户的sub字段值
  • 你可以通过Cognito控制台查看服务用户详情获取sub值,然后在Snowflake中创建/修改对应用户:
    CREATE USER IF NOT EXISTS <cognito_service_user_sub> LOGIN_NAME = '<cognito_service_user_sub>';
    

3. 验证令牌内容(可选但关键)

调用SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN()之前,先解码access_token,确认以下字段:

  • iss:与Snowflake集成中external_oauth_issuer完全一致
  • aud:包含external_oauth_audience_list中的至少一个值
  • sub:存在且与Snowflake用户的LOGIN_NAME匹配

完成以上配置后,重新请求Cognito的access_token,再用Snowflake的验证函数测试即可。

内容的提问来源于stack exchange,提问作者Moravas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:07:18