x-amzn-ErrorType:UnrecognizedClientException使用临时凭据调用AWS Api网关时

时间:2017-08-14 13:14:34

标签: javascript amazon-web-services lambda aws-api-gateway amazon-cognito

使用Cognito用户池成功进行身份验证后,我获得了访问aws资源的临时凭据

               var akey='';
               var skey='';
               var st='';

               AWS.config.credentials.get(function (err) {
                       akey = AWS.config.credentials.accessKeyId;
                       skey = AWS.config.credentials.secretAccessKey;
                       st = AWS.config.credentials.sessionToken;
                       var identityId = AWS.config.credentials.identityId;

                        });

使用这些凭据我称之为使用IAM授权的API

function ViewMyBookings_With_Credentials() {
debugger;
var apigClient = apigClientFactory.newClient({
     accessKey: akey,
     secretKey: skey,
     sessionToken: st,
     region: 'ap-south-1'
});
var params = {    };
var body = ''; // Get Request
var additionalParams = {      };
apigClient.mybookingsGet(params, body, additionalParams)
    .then(function (result) {
        //This is where you would put a success callback
        alert(result.data);
    }).catch(function (result) {
        debugger;
        alert(result.data);
        //This is where you would put an error callback
    });

}

选项请求成功,我得到200 Ok 但是对于实际请求显示CORS错误,我确信CORS没有问题。 响应标题显示

的x AMZN-错误类型:UnrecognizedClientException X-Cache:来自cloudfront的错误

我在AWS文档中搜索了这个,但未收到任何积极响应。

One Question addressing similar issue

但答案不正确/完整,请让我知道我错过了什么。

2 个答案:

答案 0 :(得分:1)

转到API网关>选项(适用于您的GET方法的资源)>标题映射>

  • 使用控制允许报头 '的Content-Type,X-AMZ-日期,授权,X-API密钥,X-AMZ-安全令牌,X-XSRF-TOKEN,接入控制允许接头,访问控制,允许 - 原点'
  • 访问控制 - 允许 - 方法' DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'
  • 访问控制 - 允许 - 来源' *'如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:0)

这个问题与javascript代码有关。就我而言,我正在使用python并调用安全的API。成功获得凭证。但是得到确切的指定错误。因此,回答我的问题,如果有人因同样的错误而落在这里,将非常有用。

在通话中,我必须使用auth = authenticaion()这样操作
authenticaion()函数返回以下内容

return AWS4Auth(temp_credentials['AccessKeyId'],
                    temp_credentials['SecretAccessKey'],
                    'us-west-2',
                    'call-api',
                    temp_credentials['SessionToken'])

但是对于AWS4Auth,会话令牌是必需的。我们必须指定它。所以下面的代码解决了我的问题

return AWS4Auth(temp_credentials['AccessKeyId'],
                    temp_credentials['SecretAccessKey'],
                    'us-west-2',
                    'call-api',
                    session_token=temp_credentials['SessionToken'])