带有Lambda集成的我的Api网关工作正常。但是,当我需要一个api键时,它不起作用。 “跨域请求被阻止:相同的原始策略不允许读取https://some-aws-api-gateway处的远程资源。(原因:缺少CORS标头'Access-Control-Allow-Origin')。”
一些发现:没有api键X-Api-Key
的api网关对POSTMAN和Browser都适用。具有api键的Api网关仅适用于POSTMAN。
我已经多次检查了标头,它们都是应有的。
{
"Access-Control-Allow-Origin":"*",
"Access-Control-Allow-Credentials":"true",
"Access-Control-Allow-Methods":"GET,OPTIONS",
"Access-Control-Allow-Headers":"Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
"Content-Type":"application/json"
}
我决定做一个实验。我所做的是删除api密钥要求并将"Access-Control-Allow-Origin":"*"
更改为"Access-Control-Allow-Origin":"https://example.com/")
。现在来自浏览器的请求出现此错误:CORS标头“ Access-Control-Allow-Origin”与预期结果不匹配“ https://example.com”。对我而言,这仅意味着我在AWS Api Gateway中设置的标头是正确的。
到目前为止我所知道的:
"Access-Control-Allow-Origin":"*"
,不需要api密钥WORKS"Access-Control-Allow-Origin":"*"
,带有api键不工作,错误:“跨域请求被阻止:相同的原始策略不允许读取https://some-aws-api-gateway处的远程资源。(原因:CORS标头'Access-Control-Allow -Origin'missing)。“"Access-Control-Allow-Origin":"https://example.com"
(或与来源不同的任何域),且需要api键不工作,错误:与2相同"Access-Control-Allow-Origin":"https://example.com"
,没有api键不工作,错误:CORS标头'Access-Control-Allow-Origin'与'https://example.com'不匹配”>如果您注意到,一旦需要api键(2和3),您将收到相同的错误消息。
我的问题是,为什么在需要api键(X-Api-Key
)时CORS失败,而在不需要api键时通过?这使我相信Api网关上的CORS标头很好,但是,问题出在从浏览器请求验证api密钥的身份验证过程中。为什么在Api密钥上缺少CORS标头Access-Control-Allow-Origin
?我想知道api键/标头是否需要编码为某种格式或其他格式。
var myHeaders = new Headers();
myHeaders.append("X-Api-Key", apiKey);
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow',
mode: 'cors',
credentials: 'include'
};
fetch("https://some-aws-api-gateway", requestOptions)
.then(response => response.json())
.then(result => console.dir(result))
.catch(error => console.log('error', error));
带有Lambda集成的我的Api网关工作正常。但是,当我需要一个api键时,它不起作用。 “跨域请求被阻止:相同的原始策略不允许读取远程资源...
问题已解决。问题的根源在于,我需要AWS Api Gateway控制台中OPTIONS
方法的api密钥。但是,所有其他执行实际CRUD操作的方法,例如GET
和POST
必须具有true
的“需要API密钥”。