为 Snowflake 外部 OAuth 配置 Microsoft Azure Active Directory 后访问令牌无效

问题描述 投票:0回答:1

我尝试按照 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 azure-active-directory snowflake-cloud-data-platform
1个回答
0
投票

在雪花配置中使用 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 进行更新。用户令牌和机器令牌的步骤需要位于不同的部分,而不是混合在一起。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.