我尝试按照 Snowflake 教程为外部 OAuth 配置 Microsoft Azure AD:https://docs.snowflake.com/en/user-guide/oauth-azure.html
配置步骤顺利进行,我能够使用最后一步:https://docs.snowflake.com/en/user-guide/oauth-azure.html#testing-procedure 获得访问权限来自 AAD 的代币。
但是,当我尝试使用 JDBC 驱动程序将访问令牌与 Snowflake 一起使用时,我收到了错误:
"net.snowflake.client.jdbc.SnowflakeSQLException: Invalid OAuth access token.
创建的 Snowflake 集成的形式为:
create security integration ext_oauth_azure_ad
type = external_oauth
enabled = true
external_oauth_type = azure
external_oauth_issuer = '<issuer-url>'
external_oauth_jws_keys_url = '<keys-url>/discovery/v2.0/keys'
external_oauth_audience_list = ('https://<app-id-uri>')
external_oauth_token_user_mapping_claim = 'upn'
external_oauth_snowflake_user_mapping_attribute = 'login_name'
external_oauth_any_role_mode = 'ENABLE';
我尝试通过将
external_oauth_token_user_mapping_claim
更改为 email
来尝试此配置,因为这是解码的 JWT 访问令牌中与 login_name
匹配的属性,但无济于事。
AD 中提供的范围是
session:role-any
,它应该对任何范围都有效。
不知道如何继续发布此内容。
编辑:
用于获取访问令牌的命令是:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" --data-urlencode "client_id=<ad-client-id>" --data-urlencode "client_secret=<ad-client-secret>" --data-urlencode "username=<ad-user-email>" --data-urlencode "password=<my-password>" --data-urlencode "grant_type=password" --data-urlencode "scope=<scope-as-in-ad>" 'https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token'
更新:
尝试使用命令:
select system$verify_external_oauth_token('<access_token>');
验证Snowflake中的token是否有效并得到结果:
Token Validation finished.{"Validation Result":"Failed","Failure Reason":"EXTERNAL_OAUTH_INVALID_SIGNATURE"}
这很奇怪,因为我已经根据配置步骤添加了正确的发行者(来自联合元数据文档的entityId) )
在雪花配置中使用 Azure 应用程序特定的 oauth 配置 URL(创建安全集成)来指向正确的密钥:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration?appid={appid}
在此 url 的响应中,您将找到特定于该应用程序(客户端)ID 的 jwks_uri,该 ID 用于 EXTERNAL_OAUTH_JWS_KEYS_URL 雪花参数。
我还发现我需要调整 EXTERNAL_OAUTH_AUDIENCE_LIST 以匹配颁发的令牌中的 aud 字段,但是当您遇到它时,会出现一个更有用的错误。使用 https://jwt.ms 在您的令牌中查看此字段。
截至撰写本文时,https://docs.snowflake.com/en/user-guide/oauth-azure 指南过于复杂且错误,需要针对 oauth2 v2 和 Azure 进行更新。用户令牌和机器令牌的步骤需要位于不同的部分,而不是混合在一起。
祝你好运!