如何配置AWS SNS以通过Azure API Manager的基本身份验证
配置AWS SNS基本身份验证以对接Azure API Manager
Postman能通过https://user:password@myurl.com/sns访问是因为它会自动将URL中的用户名密码转换为Authorization请求头,但AWS SNS不会自动做这个转换,得手动配置认证信息,以下是两种可行方案:
方法1:在SNS订阅中添加自定义Authorization请求头
这是最规范的方案,直接让SNS请求携带认证头:
生成Base64编码的认证字符串
把你的用户名和密码拼接成user:password格式,转换成Base64编码:- Linux/macOS命令行:
echo -n "user:password" | base64 - Windows PowerShell:
[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("user:password"))
得到编码结果后,构造Authorization头的值:Basic <你的Base64编码字符串>,比如Basic dXNlcjpwYXNzd29yZA==。
- Linux/macOS命令行:
配置SNS订阅的自定义头
- AWS CLI方式:执行命令替换占位符:
aws sns subscribe \ --topic-arn arn:aws:sns:你的区域:你的账号ID:目标主题ARN \ --protocol https \ --notification-endpoint https://myurl.com/sns \ --attributes '{ "Headers": "{\"Authorization\": \"Basic 你的Base64编码字符串\"}" }' - AWS控制台方式:创建/编辑HTTPS订阅时,展开「订阅属性」,在「Headers」字段输入JSON格式的头信息:
{"Authorization": "Basic 你的Base64编码字符串"}。
- AWS CLI方式:执行命令替换占位符:
方法2:修改Azure APIM策略适配URL中的凭证(不推荐)
如果无法修改SNS配置,可调整APIM策略让它兼容URL中的凭证:
在APIM的API入站策略中添加以下代码,放在<inbound>节点内:
<choose> <when condition="@(!context.Request.Headers.ContainsKey("Authorization"))"> <set-header name="Authorization" exists-action="override"> <value>@("Basic " + System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(context.Request.Url.UserInfo)))</value> </set-header> </when> </choose>
该策略会自动提取URL中的用户名密码,转换成Authorization头。但这种方式存在安全风险,URL中的凭证可能被日志记录,优先推荐方法1。
配置完成后,触发SNS测试通知,查看Azure APIM日志确认Authorization头已正常传递即可。
内容的提问来源于stack exchange,提问作者perpetual confusion
相关产品推荐
相关产品推荐

