#azure #oauth #azure-active-directory #snowflake-cloud-data-platform
#azure #oauth #azure-active-directory #snowflake-cloud-data-platform
Вопрос:
Я пытался настроить Microsoft Azure AD для внешнего OAuth в соответствии с руководством по Snowflake:https://docs.snowflake.com/en/user-guide/oauth-azure.html
Шаги настройки прошли без сбоев, и я смог использовать последний шаг:https://docs.snowflake.com/en/user-guide/oauth-azure.html#testing-procedure для получения маркера доступа из AAD.
Однако, когда я попытался использовать токен доступа со Snowflake с помощью драйвера JDBC, я получил сообщение об ошибке: "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 Validation finished.{"Validation Result":"Failed","Failure Reason":"EXTERNAL_OAUTH_INVALID_SIGNATURE"}
Это странно, потому что я добавил правильного отправителя на основе шага настройки (EntityId из документа метаданных Федерации)
Комментарии:
1. Пожалуйста, поделитесь кодом получения маркера доступа.
2. @AllenWu добавили команду. Я использовал команду curl для получения токена. Но получение токена с использованием интерактивного подхода (с использованием конечной точки авторизации) также работает, но при попытке подключения выдает ту же ошибку.
3. Вы уверены, что используете
https://login.microsoftonline.com/<client-id>/oauth2/v2.0/token
в качестве полномочий?<client-id>
Неверно. Вы должны использовать идентификатор клиента.4. @AllenWu Ой, я взял его непосредственно из метаданных. Да, я использую идентификатор клиента только там. Обновлена команда в вопросе. Извините за путаницу.
5. Можете ли вы проверить фактическое значение
SNOWFLAKE_APPLICATION_ID_URI
иscope=<scope-as-in-ad>
? Они должны быть сопоставлены. Например,SNOWFLAKE_APPLICATION_ID_URI
естьhttps://your.company.com/4d2a8c2b-a5f4-4b86-93ca-294185f45f2e
, тогда область действия должна бытьhttps://your.company.com/4d2a8c2b-a5f4-4b86-93ca-294185f45f2e/.default
.