使用Requests包调用Amazon SNS发SMS遇认证令牌缺失错误如何解决?
解决Amazon SNS SMS请求MissingAuthenticationToken错误
你遇到的错误是因为AWS SNS API不支持HTTP Basic认证(也就是你用的auth=(aws_access_key_id, aws_secret_access_key)这种方式),AWS要求所有API请求必须使用AWS Signature Version 4进行签名,这才是有效的认证方式。
快速解决方案:使用requests-aws4auth库
最简单的方式是用requests-aws4auth库自动生成符合要求的签名,无需手动处理复杂的签名逻辑:
- 安装依赖:
pip install requests-aws4auth
- 修改代码如下:
import requests from requests_aws4auth import AWS4Auth url = "https://sns.eu-central-1.amazonaws.com" aws_access_key_id = "YOUR_ACCESS_KEY" aws_secret_access_key = "YOUR_SECRET_KEY" region = "eu-central-1" service = "sns" # 生成AWS V4认证对象 auth = AWS4Auth(aws_access_key_id, aws_secret_access_key, region, service) params = { "Action": "Publish", "Version": "2010-03-31", "PhoneNumber": "+49123456789", "Message": "Hello World!", } # 发送请求时使用生成的auth对象 response = requests.post(url, data=params, auth=auth) print(response.text)
手动实现签名(不推荐)
如果必须避免第三方依赖,需要手动实现AWS Signature Version 4签名流程,这涉及到:
- 构造规范请求字符串
- 生成签名密钥
- 计算请求签名
- 在请求头中添加
Authorization等签名相关字段
这个过程非常繁琐,需要严格遵循AWS的签名规范,容易出错,因此除非有特殊需求,优先推荐使用requests-aws4auth。
内容的提问来源于stack exchange,提问作者Gurkenkönig
相关产品推荐
相关产品推荐

