通过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用户池中添加自定义资源服务器:- 进入Cognito用户池 → 切换到“资源服务器”选项卡 → 点击“创建资源服务器”
- 填写“标识符”为你的Snowflake URL(
https://<sf_subscription>.us-east-1.snowflakecomputing.com),并添加至少一个自定义范围(例如snowflake_access) - 返回应用客户端设置页面,将刚才创建的自定义范围添加到“Allowed OAuth Scopes”中
- 请求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
相关产品推荐
相关产品推荐

