无法通过ajax调用aws API网关

时间:2017-05-19 15:30:37

标签: ajax amazon-web-services amazon-dynamodb aws-lambda aws-api-gateway

我正在使用aws APi网关和api网关自定义授权程序。我对api网关自定义授权器的代码如下:

console.log('Loading function');

 exports.handler =  (event, context, callback) => {
var token = event.authorizationToken;
// Call oauth provider, crack jwt token, etc.
// In this example, the token is treated as the status for simplicity.

switch (token.toLowerCase()) {
    case 'allow':
        callback(null, generatePolicy('user', 'Allow', event.methodArn));
        break;
    case 'deny':
        callback(null, generatePolicy('user', 'Deny', event.methodArn));
        break;
    case 'unauthorized':
        callback("Unauthorized");   // Return a 401 Unauthorized response
        break;
    default:
        callback("Error: Invalid token"); 
}
};

var generatePolicy = function(principalId, effect, resource) {
var authResponse = {};

authResponse.principalId = principalId;
if (effect && resource) {
    var policyDocument = {};
    policyDocument.Version = '2012-10-17'; // default version
    policyDocument.Statement = [];
    var statementOne = {};
    statementOne.Action = 'execute-api:Invoke'; // default action
    statementOne.Effect = effect;
    statementOne.Resource = resource;
    policyDocument.Statement[0] = statementOne;
    authResponse.policyDocument = policyDocument;
}

// Can optionally return a context object of your choosing.
authResponse.context = {};
authResponse.context.stringKey = "stringval";
authResponse.context.numberKey = 123;
authResponse.context.booleanKey = true;
return authResponse;

正如您所看到的,它只是aws网站中提供的一个简单的模拟示例。 然后我使用此授权程序在API网关中配置了我的get方法。同样在方法执行中,我添加了一个名为authorizationToken的自定义hedear,它将由授权者使用。

当我使用邮递员时,一切都很好:

enter image description here

但是当我尝试通过ajax调用它时,我得到以下错误:

XMLHttpRequest cannot load https://590vv3bkda.execute-api.us-east-1.amazonaws.com/hamedstg/tjresource/story. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 401.

这是我的ajax电话:

$.ajax(
    'https://590vv3bkda.execute-api.us-east-1.amazonaws.com/xxxxxxx',
    {
        method : 'GET',
        headers : {                                                                         
                      'authorizationToken' : 'allow'
                },
        beforeSend : function(xhr) {
            xhr.setRequestHeader('authorizationToken', 'allow');
        }
}).then(function(data) {
    console.log(data);
});

值得注意的是,我在aws的api上启用了CORS。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

自启用CORS以来,您是否添加了任何方法或资源?如果是,则再次运行CORS向导并重新部署到您的阶段。

此外,请确保资源上的OPTIONS方法不需要/使用客户授权程序。选项需要向所有人开放,因为在某些情况下,浏览器会代表您调用它以进行飞行前CORS检查。

还有一个已知的问题是,当API网关调用因任何原因失败时,CORS标头未设置,因此您将获得" No' Access-Control-Allow-原产地'标题存在"错误,当根本原因完全不同时。尝试在浏览器上启用开发人员日志记录,获取发送到API的确切请求(可能是OPTIONS方法),并尝试从API网关控制台进行测试调用。这将让您查看输出和日志,以确定是否存在其他问题。