首页 > 解决方案 > 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,并且它应该为我执行签名,所以我怀疑这可能是实际问题(否则更多的人会遇到这种情况)。

已进行故障排除

StackOverflow 上有很多与此类似的问题,但用于访问 S3 或 API Gateway。这不是同一个问题,因为 S3 和 API Gateway 都可以为服务设置 CORS 配置。据我所知,对于 CloudDirectory,情况并非如此。

标签: javascriptamazon-web-servicesaws-sdkaws-sdk-js

解决方案


推荐阅读