如何通过AWS Identity Center与EntraID外部IdP连接RedShift并获取有效JWT?
解决RedShift DBeaver EXT_JWT令牌无效问题
1. 先确认EntraID应用的核心配置
- 给EntraID注册的应用添加RedShift专属API权限:勾选
redshift:GetClusterCredentials和redshift:DescribeClusters(无服务器工作组需额外确认对应权限),并完成管理员同意操作。 - 检查应用清单:如果用密码流(ROPC),要把
allowPublicClient设为true;若用授权码流,需配置匹配的重定向URI(比如http://localhost:8080)。
2. 正确构造获取JWT的POST请求
调用https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token时,必须用application/x-www-form-urlencoded格式传递以下参数:
grant_type: 选password(适合本地工具的ROPC流,MFA用户不能用这个,后面会说替代方案)client_id: 你的EntraID应用IDusername: 用于认证的EntraID用户邮箱password: 用户密码scope: 必须填https://redshift.amazonaws.com/.default(这是RedShift要求的核心受众,错了令牌肯定无效)client_secret: 机密客户端需要加,公共客户端不用
示例curl命令:
curl -X POST https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password&client_id=<你的应用ID>&username=<用户邮箱>&password=<用户密码>&scope=https://redshift.amazonaws.com/.default"
3. 验证获取到的JWT
拿到access_token后,用本地JWT解码工具(比如jwt-cli)检查关键字段:
aud: 必须是https://redshift.amazonaws.comexp: 确保当前时间早于令牌过期时间戳sub: 匹配你的EntraID用户IDazp: 匹配你的应用client_id
要是aud不对,百分百是scope设置错了,必须用https://redshift.amazonaws.com/.default才能生成符合RedShift要求的令牌。
4. DBeaver端的配置检查
- 连接设置里,认证方式选
AWS Identity Provider,插件指定com.amazon.redshift.plugin.IdpTokenAuthPlugin token_type设为EXT_JWT,把获取到的access_token完整粘贴到Token字段- 确认Identity Center权限集:给用户分配的权限集必须包含
redshift:Connect操作,且关联到目标RedShift工作组
5. MFA用户的替代方案
如果用户开了MFA,ROPC流用不了,得换授权码流:
- 在EntraID应用里加重定向URI
http://localhost:8080 - 构造授权URL:
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?client_id=<你的应用ID>&response_type=code&redirect_uri=http://localhost:8080&scope=https://redshift.amazonaws.com/.default - 打开URL完成MFA认证,拿到授权码
- 用授权码换令牌:POST请求里加
grant_type=authorization_code&code=<拿到的授权码>&redirect_uri=http://localhost:8080 - 把新获取的
access_token填入DBeaver即可
内容的提问来源于stack exchange,提问作者Fabi_92
相关产品推荐
相关产品推荐

