Недопустимый токен доступа после настройки Microsoft Azure Active Directory для Snowflake External OAuth

#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 .