[英]Getting error EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY with a public key stored on Amazon s3
我正在开发一个外部 OAuth 提供商,以便能够使用我们公司的登录机制让员工和客户连接到雪花。
首先,为了测试,我创建了一个数据库:
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';
并在雪花数据库中创建安全集成 object,如下所示:
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 上验证)+ 使用公钥验证的签名:
(Base 64 url 编码)
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...
}
执行时:
select SYSTEM$VERIFY_EXTERNAL_OAUTH_TOKEN('eyJ0eXAi...wPgXvOtg');
使用系统创建的一些令牌系统返回错误:
令牌验证完成。{“验证结果”:“失败”,“失败原因”:“EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY”}
(在@Srinath Menon 的反馈之后)
从公钥,我创建了一个 json web 密钥(JWK)。 我使用 java 代码创建了它,当我验证时,我注意到也可以使用在线工具进行验证。 https://8gwifi.org/jwkconvertfunctions.jsp
我将结果作为文件上传到 AWS S3 上,并确保它是公开可用的,并且内容类型是 application/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”}
终于成功了,但稍微改变了我的解决方案:
使用命令创建密钥对(在 MacOS 下):
openssl genrsa -out snowflakeExternalOAuth.pem 2048
openssl rsa -in snowflakeExternalOAuth.pem -pubout > snowflakeExternalOAuth.pub
我提取了公钥内容(删除了 HEADER、FOOTER 和新行)以初始化属性external_oauth_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';
我还注意到我忘记在我的令牌中使用之前定义的用户名(“fred_ica_user”)添加一些“upn”声明。
经过这些不同的更改后,系统可以正常工作。
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.