Snowflake自定义OAuth出现invalid_client错误,请求排查解决
看起来你在基于Snowflake自定义OAuth集成做Django应用对接时遇到了invalid_client错误,我来帮你梳理下可能的排查方向和解决办法,先理清楚你的操作流程:
你先是按照Snowflake自定义OAuth文档创建了安全集成:
CREATE SECURITY INTEGRATION my_app_oauth TYPE = OAUTH ENABLED = TRUE OAUTH_CLIENT = CUSTOM OAUTH_CLIENT_TYPE = 'CONFIDENTIAL' OAUTH_REDIRECT_URI = 'https://b54rmx30-8000.inc1.devtunnels.ms/callback/snowflake/' OAUTH_ISSUE_REFRESH_TOKENS = TRUE OAUTH_REFRESH_TOKEN_VALIDITY = 7776000;
之后执行了DESC SECURITY INTEGRATION my_app_oauth;和SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('DATAOPSLY_OAUTH');获取到了client_id和client_secret,但在Django的登录、回调视图对接时出现了invalid_client错误。
下面是几个重点排查方向:
检查Client ID/Secret的来源是否匹配
你创建的集成名称是my_app_oauth,但执行SYSTEM$SHOW_OAUTH_CLIENT_SECRETS时指定的是DATAOPSLY_OAUTH,这里是不是名称打错了?一定要确保查询的集成名称和创建的完全一致,Snowflake对象名称默认大小写不敏感,但如果是带引号创建的要严格匹配。另外复制这两个值时别多带空格或者少复制字符,建议直接从查询结果里复制粘贴,手动输入很容易出错。重定向URI必须完全一致
Snowflake对重定向URI的匹配要求非常严格,必须和创建集成时OAUTH_REDIRECT_URI的内容完全相同——包括协议(https/http)、域名、端口、路径,甚至末尾的斜杠都不能差。你Django应用里配置的回调地址要和https://b54rmx30-8000.inc1.devtunnels.ms/callback/snowflake/完全一致才行。确认Confidential类型客户端的验证逻辑
你设置的OAUTH_CLIENT_TYPE = 'CONFIDENTIAL',这种类型的客户端在请求令牌时,必须携带client_id和client_secret做身份验证。检查下Django里获取令牌的POST请求,是不是正确传递了这两个参数?比如是用HTTP基本认证方式,还是把它们作为表单参数传递,这两种方式都可以,但不能漏掉。检查集成是否处于启用状态
虽然创建时设置了ENABLED = TRUE,但可以再执行DESC SECURITY INTEGRATION my_app_oauth;确认ENABLED字段的值是不是TRUE,有时候可能因为配置变更或者其他原因被意外禁用。验证网络连通性
你用的是devtunnels的隧道地址做回调,要确保这个隧道是正常工作的,Snowflake的OAuth服务能正常访问到这个地址。另外Django应用所在的网络也要能正常访问Snowflake的OAuth端点。
如果可以的话,把Django里获取令牌的完整代码贴出来,能更精准地定位问题~
备注:内容来源于stack exchange,提问作者Saiprasath

