API GW Lambda 代理集成 CORS 问题
Posted
技术标签:
【中文标题】API GW Lambda 代理集成 CORS 问题【英文标题】:API GW Lambda proxy integration CORS issue 【发布时间】:2021-03-23 09:23:58 【问题描述】:在我的爱好项目网站上的登录请求后尝试发回 cookie。由于某种原因,它在本地运行时工作,即 http://localhost:3000。但是,当我将我的 API 推送到网上并尝试通过我的实时网站访问它时,我在 Application -> Cookies -> website (使用 chrome) 下看不到任何 cookie。我用谷歌搜索了很多,我相信我已经检查了每一个 CORS 政策。
nodeJS 在 AWS lambda 中运行,并通过 API 网关调用。 API GW 通过云端分发(如果重要)定向到。
在我的快速后端中,我已经相应地记录了我的标题:
res.cookie('jwt', token, cookieOptions);
console.log('Checking cookie', res);
console.log('Checking cookie', res.cookies);
res.status(statusCode).json(
status: 'success',
data:
user
);
这个的输出部分是这样的:
'access-control-allow-origin': [ 'Access-Control-Allow-Origin', 'https://example.com' ],
vary: [ 'Vary', 'Origin' ],
'access-control-allow-credentials': [ 'Access-Control-Allow-Credentials', 'true' ],
'access-control-allow-methods':
[ 'Access-Control-Allow-Methods',
'GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS' ],
'access-control-allow-headers':
[ 'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, X-PINGOTHER' ],
'x-ratelimit-limit': [ 'X-RateLimit-Limit', 100 ],
'x-ratelimit-remaining': [ 'X-RateLimit-Remaining', 97 ],
date: [ 'Date', 'Fri, 11 Dec 2020 23:20:28 GMT' ],
'x-ratelimit-reset': [ 'X-RateLimit-Reset', 1607732145 ],
quizappuserloggedin: [ 'QuizAppUserLoggedIn', 'false' ],
'set-cookie':
[ 'Set-Cookie', 'my-cookie'; Path=/; Expires=Sat, 12 Dec 2020 23:20:34 GMT; HttpOnly; Secure'
据我所知,我已经正确设置了我的 CORS 设置。从我的前端我已经设置:
axios.defaults.withCredentials = true;
据我所知,我已经完成了在Set cookies for cross origin requests 中可以找到的所有内容
意思是我已经双重检查了我的 cors 设置,从打印语句看来,cookie 正在被发送。但是为什么浏览器不接呢?
如果有帮助,可以发布实际站点和 github 存储库,我已经被困在这里整整了。
更新
我查看了浏览器中的响应标头,并将其与后端 api 中的标头进行了比较。从该比较中,我可以看到我的“set-cookie”标头未包含在响应中,即使我可以清楚地看到它包含在来自后端的响应中:
更新 2
我相信,经过进一步调查,我已将其范围缩小为 AWS API Gateway 的 CORS 问题。我研究了这些,但仍然没有运气。
How to add CORS header to AWS API Gateway response with lambda proxy integration activate
Amazon API gateway ignores set-cookie
在 express 框架发送响应之前来自 lambda cloudwatch 的日志以及来自 API 网关的 cloudwatch 日志(响应标头)。
响应头的 API GW cloudwatch 日志:
express框架发送的响应对象的Lambda cloudwatch日志:
【问题讨论】:
您是在尝试访问跨域前端应用程序中的 cookie(即在前端 JS 代码中),还是只是想确保 cookie 是每个请求都返回后端?因为后者可以按照您提供的链接中的步骤完成,但是前端代码确实无法直接访问另一个来源的 cookie。 我正在尝试在我的前端访问它以进行身份验证。这家伙在做什么:youtube.com/… 他正在使用httpOnly
cookie,因此他无法在前端应用代码中访问它们。
"javascript Document.cookie API 无法访问具有 HttpOnly 属性的 cookie;它只发送到服务器。" developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
请务必了解,例如,如果您的后端位于 api.example.com 而您的前端位于 www.example.com,那么您将永远不会看到 api .example.com cookie 在您的 www.example.com 的 cookie 列表中。 Cookie 是特定于来源的,但没有端口隔离。但即使您看不到 api.example.com cookie,它仍然可以附加到浏览器对该域的请求。
【参考方案1】:
事实证明这不是 CORS 问题。我只是忘记从我的云端分发中转发 cookie。
【讨论】:
以上是关于API GW Lambda 代理集成 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章
AWS API Gateway 仅在使用 SAM 时支持 CORS for OPTIONS(没有 Lambda 代理集成)
使用 Rest API Gateway lambda 集成 CORS 问题进行放大