#amazon-s3 #oauth-2.0 #oauth #snowflake-cloud-data-platform
Вопрос:
Я разрабатываю внешнего поставщика OAuth, чтобы иметь возможность использовать наш механизм входа в систему компании, позволяющий сотрудникам и клиентам подключаться к snowflakes.
Настройка снежинки:
Во — первых, я создал базу данных для тестирования :
use role accountadmin;
create database fred_ica_db;
create warehouse fred_ica_warehouse;
create role fred_ica_role;
create user fred_ica_user password = '******' login_name = 'upn';
grant usage on database fred_ica_db to role fred_ica_role;
grant usage on warehouse fred_ica_warehouse to role fred_ica_role;
grant role fred_ica_role to user fred_ica_user;
alter user fred_ica_user set DEFAULT_WAREHOUSE='FRED_ICA_WAREHOUSE', DEFAULT_ROLE='FRED_ICA_ROLE' , DEFAULT_NAMESPACE='FRED_ICA_DB.PUBLIC';
и создал объект интеграции безопасности в базе данных snowflake следующим образом :
create or replace security integration fred_oauth_integration
type = external_oauth
enabled = true
external_oauth_type = custom
external_oauth_issuer = 'http://$(some_endpoint)/snowflakeAuth/accessToken'
external_oauth_jws_keys_url = 'https://$(aws_account).s3.us-west-2.amazonaws.com/$(public_key_filename)'
external_oauth_audience_list = ('https://xxxx.us-east-1.snowflakecomputing.com')
external_oauth_scope_mapping_attribute = 'scp'
external_oauth_token_user_mapping_claim='upn'
external_oauth_snowflake_user_mapping_attribute='login_name';
Первая попытка :
Я создал пару закрытого/открытого ключа для обработки подписи токена и загрузил открытый ключ в AWS S3, который также будет нашей производственной целью для этого внешнего поставщика OAuth. В настоящее время файл доступен для широкой публики (проверено на общедоступном устройстве). Открытый ключ имеет форму :
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKC...
...4oQIDAQAB
-----END RSA PUBLIC KEY-----
Мой сервер OAuth генерирует некоторый допустимый токен JWT (проверен на jwt.io) подпись, подтвержденная открытым ключом :
(Базовый URL-адрес 64 в кодировке)
eyJ0eXAi...wPgXvOtg
и расшифрован :
{
"typ": "JWT",
"alg": "RS256"
}
{
"aud": "https://xxxx.us-east-1.snowflakecomputing.com/",
"scp": [
"session:role:fred_ica_role"
],
"iss": "http://$(some_endpoint)/snowflakeAuth/accessToken",
"exp": 1632483169,
"iat": 1632475969
}
{
...signature...
}
when executing :
select SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN('eyJ0eXAi...wPgXvOtg');
с помощью некоторого токена, созданного системой
Система возвращает ошибку :
Проверка токенов завершена.{«Результат проверки»:»Сбой»,»Причина сбоя»:»EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY»}
Вторая попытка
(после того, как @Srinath Menon оставил свой отзыв)
Из открытого ключа я создал веб-ключ json(JWK). Я создал его с помощью кода java, и когда я проверил, я заметил, что для этого также можно использовать онлайн-инструмент. https://8gwifi.org/jwkconvertfunctions.jsp
Я загрузил результат в виде файла на AWS S3 и убедился, что он общедоступен и что тип содержимого-приложение/json :
JWKS :
{"keys":[{"kty":"RSA","e":"AQAB","kid":"5979064a-e202-4321-90ad-8a51329aad61","n":"2636yeJSQqyO5AegaIu6vEHg6w-MzGy1nPy2qj0zJfbDw6O0ATGkG_ibdfWqMHxU-JEBV1wiThv8_Mk67cst4W5U-fg-Miy8SDxYZtIkWFMAeVbamjpi_8BChCIJRVXvS6ZQofGgmFHlJAnWszL0hID8IaHigpBLTNEVHKuPeVGTYg3RcoWTjjB3WtaIj8XqKpQY47EUOiHOa3DZISXteYlfZu9yhQdB-7s0kQhdzk-RiQIHsLfnn-ksVzntmmwHVE5KVllMJt-23bH8c1TbtrMzWHflY85K3iSjhB3EHyeqhZnKuhAR5WVxPxkGIdr9qku1Q6L489R1wRkE2Rk4oQ"}]}
JWK :
{"kty":"RSA","e":"AQAB","kid":"5979064a-e202-4321-90ad-8a51329aad61","n":"2636yeJSQqyO5AegaIu6vEHg6w-MzGy1nPy2qj0zJfbDw6O0ATGkG_ibdfWqMHxU-JEBV1wiThv8_Mk67cst4W5U-fg-Miy8SDxYZtIkWFMAeVbamjpi_8BChCIJRVXvS6ZQofGgmFHlJAnWszL0hID8IaHigpBLTNEVHKuPeVGTYg3RcoWTjjB3WtaIj8XqKpQY47EUOiHOa3DZISXteYlfZu9yhQdB-7s0kQhdzk-RiQIHsLfnn-ksVzntmmwHVE5KVllMJt-23bH8c1TbtrMzWHflY85K3iSjhB3EHyeqhZnKuhAR5WVxPxkGIdr9qku1Q6L489R1wRkE2Rk4oQ"}
Оба этих подхода привели к одной и той же ошибке :
Проверка токенов завершена.{«Результат проверки»:»Сбой»,»Причина сбоя»:»EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY»}
Комментарии:
1. Делает ли этот URL-адрес «https://$(aws_account).s3.us-west-2.amazonaws.com/$(public_key_filename)» возвращает содержимое в текстовом формате?
2. Да, действительно : завиток https://$(aws_account).s3.us-west-2.amazonaws.com/$(имя файла public_key_filename). ——НАЧАТЬ ОТКРЫТЫЙ КЛЮЧ RSA — — — — — MIIBCgKC… …4oQIDAQAB — — — — — ЗАВЕРШИТЬ ОТКРЫТЫЙ КЛЮЧ RSA——
3. По всей вероятности, это и есть причина этой проблемы, ожидание заключается в том, что он должен быть в формате content-type/ json. Передается ли какая-либо информация заголовка, которая вызывает вывод в виде открытого текста?
4. хорошо, я вижу, я упустил из виду, как должен быть построен ключ. Я попытаюсь конвертировать мой файл PEM в формат JWS. Спасибо за совет. Я отвечу с результатом, когда он будет реализован, для людей, которые столкнутся с тем же вопросом.
5. Я все еще получаю ту же ошибку после изменений. В jws_keys_url конечная точка возвращает что-то вроде : {«keys»:[{«kty»:»RSA»,»kid»:»3064f813-2c8f-4d1d-8eb7-6cb32b3d82ee»,»n»:»2636yeJS…kE2Rk4oQ»,»e»:»AQAB»}]} Проверено, что это ключ от jwk могут быть преобразованы в Пэм, и ПЭМ могут быть преобразованы в от jwk ключ на сайте 8gwifi.org/jwkconvertfunctions.jsp я также сделал тест, снимая «ключи» JSON в контейнер и оставить открытым ключом конечной точки возврата {«kty»:»ЮАР»,»малыш»:»3064f813-2c8f-4d1d-8eb7-6cb32b3d82ee»,»Н»:»2636yeJS…kE2Rk4oQ»,»е»:»АКАБ»}, но это дало тот же результат.
Ответ №1:
Наконец-то получилось, но я немного изменил свое решение :
Создал пару ключей с помощью команд (под macOS) :
openssl genrsa -out snowflakeExternalOAuth.pem 2048
openssl rsa -in snowflakeExternalOAuth.pem -pubout > snowflakeExternalOAuth.pub
Я извлек содержимое открытого ключа (удалены ВЕРХНИЙ, НИЖНИЙ колонтитулы и новые строки) для инициализации свойства external_auth_rsa_public_key
Я определил интеграцию безопасности следующим образом :
create or replace security integration fred_oauth_integration
type = external_oauth
enabled = true
external_oauth_type = custom
external_oauth_issuer = 'http://$(some_endpoint)/snowflakeAuth/accessToken'
external_oauth_rsa_public_key = 'MIIBIjAN...hQIDAQAB'
external_oauth_audience_list = ('https://xxxx.us-east-1.snowflakecomputing.com')
external_oauth_scope_mapping_attribute = 'scp'
external_oauth_token_user_mapping_claim='upn'
external_oauth_snowflake_user_mapping_attribute='login_name';
Я также заметил, что забыл добавить в свой токен утверждение » upn » с ранее определенным именем пользователя («fred_ica_user»).
После этих различных изменений система работает.
Надеюсь, это будет полезно.
Комментарии:
1. Это хорошая информация.