我正在使用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,它将由授权者使用。
当我使用邮递员时,一切都很好:
但是当我尝试通过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。
有人可以帮忙吗?
答案 0 :(得分:2)
自启用CORS以来,您是否添加了任何方法或资源?如果是,则再次运行CORS向导并重新部署到您的阶段。
此外,请确保资源上的OPTIONS方法不需要/使用客户授权程序。选项需要向所有人开放,因为在某些情况下,浏览器会代表您调用它以进行飞行前CORS检查。
还有一个已知的问题是,当API网关调用因任何原因失败时,CORS标头未设置,因此您将获得" No' Access-Control-Allow-原产地'标题存在"错误,当根本原因完全不同时。尝试在浏览器上启用开发人员日志记录,获取发送到API的确切请求(可能是OPTIONS方法),并尝试从API网关控制台进行测试调用。这将让您查看输出和日志,以确定是否存在其他问题。