javascript - AWS JavaScript SDK - CloudDirectory 缺少身份验证令牌错误
问题描述
我想我一定忽略了一些非常简单的东西,但我只是无法发现它是什么。任何帮助是极大的赞赏!
概述
我一直在对通过浏览器中的 JavaScript 访问 AWS Cloud Directory 服务的问题进行故障排除。我想出了我能想到的最简单的 API 请求(ListDirectories),但它仍然无法正常工作。
代码
引用的 SDK 文件 (aws-sdk-2.283.1.min.js) 是从AWS JavaScript SDK Builder 生成的,仅选择了 Cloud Directory 服务。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<script src="aws-sdk-2.283.1.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
AWS.config.logger = console;
// instantiate a new Cloud Directory client
// providing: region, access key id, secret access key
const cloudDirectory = new AWS.CloudDirectory({region: 'ap-southeast-2', accessKeyId: 'xxxxxxxxxxxxxxxxxxxx', secretAccessKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' });
// call the list directories API
cloudDirectory.listDirectories()
.promise()
.then((response) => {
console.log('Test of Hardcoded Creds successful');
for (let i = 0, l = response.Directories.length; i < l; i++) {
console.log(response.Directories[i].Name);
}
}).catch((reason) => {
console.log('Test of Hardcoded Creds failed: ' + reason);
});
</script>
</body>
预期行为
对 API 的成功调用应该会导致在浏览器调试窗口中显示消息“硬编码凭据测试成功”,然后是每个云目录的名称。
观察到的行为
浏览器调用https://clouddirectory.ap-southeast-2.amazonaws.com/amazonclouddirectory/2017-01-11/directory/list。这是一个 HTTP OPTIONS 请求,即检查 CORS 的飞行前。此请求失败并显示 HTTP 403 Forbidden 错误代码。
响应消息是:
<MissingAuthenticationTokenException>
<Message>Missing Authentication Token</Message>
</MissingAuthenticationTokenException>
重复以下控制台输出:
OPTIONS https://clouddirectory.ap-southeast-2.amazonaws.com/amazonclouddirectory/2017-01-11/directory/list 403 (Forbidden)
handleRequest @ aws-sdk-2.283.1.min.js:5
...
(anonymous) @ test.html:17
test.html:1 Failed to load https://clouddirectory.ap-southeast-2.amazonaws.com/amazonclouddirectory/2017-01-11/directory/list: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403.
接着:
aws-sdk-2.283.1.min.js:2 [AWS clouddirectory undefined 0.416s 3 retries] listDirectories({})
test.html:24 Test of Hardcoded Creds failed: NetworkingError: Network Failure
结论
查看请求标头,我希望看到AWS Signature v4的 Authorization 标头。我认为这个缺失是问题的根源。因为我正在使用 SDK,并且它应该为我执行签名,所以我怀疑这可能是实际问题(否则更多的人会遇到这种情况)。
已进行故障排除
- 不同的浏览器并使用私有/隐身模式(以确保浏览器插件不会干扰)。
- 测试可以通过 PowerShell 使用 Access Key ID 和 Secret Access Key 来执行相同的操作(Get-CDIRDirectories)。这有效,因此凭据是正确的。
- 测试用于传递访问密钥 ID/秘密访问密钥的参数名称是否正确 - 如果我更改任何一个参数名称,则 SDK 不会调用 API,而是返回缺少凭据消息。
- 本地访问页面(即通过在本地计算机上打开文件)以及从托管位置(即 http 到公共 S3 存储桶)。
StackOverflow 上有很多与此类似的问题,但用于访问 S3 或 API Gateway。这不是同一个问题,因为 S3 和 API Gateway 都可以为服务设置 CORS 配置。据我所知,对于 CloudDirectory,情况并非如此。
解决方案
推荐阅读
- java - QRD450(android 9) 谷歌播放服务崩溃
- mongodb - com.mongodb.MongoException:org.springframework.data.mongodb.MongoTransactionException:命令失败,错误 251(NoSuchTransaction):
- java - 当尝试测试 post() 休息端点时,请参阅:json 不能为空或为空
- ssl-certificate - 即使在安装 ssl 证书并设置系统范围的代理之后,Mitmproxy 也不会捕获 http 请求
- php - 如何打印数组的一个或多个元素?
- python - sklearn中的加权聚类
- ruby-on-rails - Rails 安装失败
- c# - .Net CLR 如何跟踪程序的执行?
- apache-flink - 生成自己的数据的 Flink 流式传输示例
- python - 如何显示最近 7 天的日期