AWS JavaScript SDK-CloudDirectory缺少身份验证令牌错误

AWS JavaScript SDK-CloudDirectory缺少身份验证令牌错误,javascript,amazon-web-services,aws-sdk,aws-sdk-js,Javascript,Amazon Web Services,Aws Sdk,Aws Sdk Js,我想我一定忽略了一些非常简单的事情,但我就是没能发现它是什么。非常感谢您的帮助 概述 我一直在解决通过浏览器中的JavaScript访问AWS云目录服务的问题。我提出了我能想到的最简单的API请求(ListDirectory),但它仍然不起作用 代码 引用的SDK文件(aws-SDK-2.283.1.min.js)是从生成的,仅选择了云目录服务 <!doctype html> <html lang="en"> <head> <meta charset

我想我一定忽略了一些非常简单的事情,但我就是没能发现它是什么。非常感谢您的帮助

概述
我一直在解决通过浏览器中的JavaScript访问AWS云目录服务的问题。我提出了我能想到的最简单的API请求(ListDirectory),但它仍然不起作用

代码

引用的SDK文件(aws-SDK-2.283.1.min.js)是从生成的,仅选择了云目录服务

<!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>
然后:

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
结论

查看请求头,我希望看到一个请求的授权头。我认为这种缺失是问题的根源。因为我正在使用SDK,它应该为我执行签名,所以我怀疑这是否是实际问题(否则会有比我更多的人经历这种情况)

已进行故障排除

  • 不同的浏览器和使用私有/匿名模式(以确保浏览器插件不会干扰)
  • 已测试访问密钥ID和机密访问密钥可通过PowerShell执行相同的操作(获取CDIRDirectories)。这是可行的,因此凭据是正确的
  • 已测试用于传递访问密钥ID/机密访问密钥的参数名称是否正确-如果我更改任何一个参数名称,则SDK不会调用API,而是返回缺少凭据的消息
  • 本地访问页面(即通过在本地计算机上打开文件)以及从托管位置(即http到公共S3存储桶)访问页面

除了访问S3或API网关之外,StackOverflow还有许多类似的问题。这不是同一个问题,因为S3和API网关都可以为服务设置CORS配置。就我所知,CloudDirectory并非如此。

我也尝试过,同样的错误。但我发现s3存储桶也存在类似的问题@Omberbekkadyrbekov-谢谢,这是一个非常有用的链接。对于阅读本文的人来说,它说在实施CORS限制的浏览器中,服务端点(至少对于S3)不支持全局S3操作(例如,列出存储桶)上的CORS。我相信其他服务端点也是如此,这就解释了这个问题。我有一张AWS的支持票(进展缓慢),如果他们确认云目录也是如此,我会更新。至少我知道我不是完全疯了:)@ommberkkadyrbekov-AWS支持人员回来说CloudDirectory不支持CORS。所以你是对的——如果你在接下来的几天里把它作为答案写下来,我会把它标记为正确的。:)我建议你自己写答案,因为你有更准确的信息
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