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 代理集成)

为 Lambda 代理集成启用 CORS 支持的问题

使用 Rest API Gateway lambda 集成 CORS 问题进行放大

如何允许API网关代理与POST请求的Cognito Authorizer集成?

如何使用 lambda 代理集成来云化 API 网关资源

API Gateway Lambda 端点代理与非代理集成