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

Posted

技术标签:

【中文标题】使用 Rest API Gateway lambda 集成 CORS 问题进行放大【英文标题】:Amplify with Rest API Gateway lambda integration CORS issues 【发布时间】:2021-01-08 23:59:03 【问题描述】:

我使用 amplify 设置了一个快速无服务器 lambda。我添加了似乎在互联网上的标题。直到最近我才添加了星星,因为我对此感到非常沮丧。

我的 lambda 标头

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Credentials", true),
  res.header("Access-Control-Allow-Methods", "*")
  res.header("Access-Control-Allow-Headers", "*")
  
  next()
);

我通过放大创建rest网关,还添加了一个路径并选择“仅认证用户”,然后推送网关。我不知道是否有必要,但我也去网关内的路由和“启用 Cors”和“部署网关”。每次添加新路线后,我都会这样做。我已经为网关打开了日志记录,它似乎使用正确的标头进行响应,但在 lambda 端,它永远不会使用放大托管堆栈从云端通过网关触发。

(878907ef-3f7c-4970-a336-227af689ada0) Method response headers: Access-Control-Allow-Headers=Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token, Access-Control-Allow-Methods=DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT, Access-Control-Allow-Origin=*, Content-Type=application/json

如果我在本地配置 main.ts 文件(如下所示),则会在我的 Angular 应用程序 (http://localhost:4200) 上导致 Cors 问题。但是如果我运行测试方法,我会从网关得到正确的响应。 (我知道其他错误会显示为 Cors 问题,但情况并非如此)

import API from '@aws-amplify/api';
import Auth from '@aws-amplify/auth';
API.configure(awsconfig);
Auth.configure(awsconfig);

如果我在本地 (http://localhost:4200) 配置 angular main.ts 文件(如下所示),则会导致 lambda 成功响应。完全没有任何 Cors 错误。

import  Amplify  from 'aws-amplify';
Amplify.configure(awsconfig);

但是当我尝试将放大应用程序推送到放大托管云堆栈时,问题又出现了。如果我使用以下配置,那么控制台中的应用程序会告诉我 "TypeError: Cannot read property 'aws_appsync_region' of null" 从不引导。

TypeError: Cannot read property 'aws_appsync_region' of null
    at t._graphqlSubscribe (main-es2015.9d63c1e97711d41894ae.js:1)
    at t.graphql (main-es2015.9d63c1e97711d41894ae.js:1)
    at t.graphql (main-es2015.9d63c1e97711d41894ae.js:1)
    at new t (main-es2015.9d63c1e97711d41894ae.js:1)
    at Object.t.ɵfac [as factory] (main-es2015.9d63c1e97711d41894ae.js:1)
    at ks.hydrate (main-es2015.9d63c1e97711d41894ae.js:1)
    at ks.get (main-es2015.9d63c1e97711d41894ae.js:1)
    at tt (main-es2015.9d63c1e97711d41894ae.js:1)
    at Object.et (main-es2015.9d63c1e97711d41894ae.js:1)
    at Object.t.ɵfac [as factory] (main-es2015.9d63c1e97711d41894ae.js:1)

import  Amplify  from 'aws-amplify';
Amplify.configure(awsconfig);

但是,如果我在配置中重新添加,它会使用 'aws_appsync_region' 删除上述错误消息,但会直接回到 lambda 的 Cors 问题。

import API from '@aws-amplify/api';
import Auth from '@aws-amplify/auth';
import  Amplify  from 'aws-amplify';
Amplify.configure(awsconfig);
API.configure(awsconfig);
Auth.configure(awsconfig);

在控制台中显示。

Access to XMLHttpRequest at 'https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/sandbox/blind/get' 
from origin 'https://sandbox.whatever.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is 
present on the requested resource.
main-es2015.dc59a351503c7e4f109f.js:1 ERROR Error: Network Error
    at LYNF.t.exports (main-es2015.dc59a351503c7e4f109f.js:1)
    at XMLHttpRequest.d.onerror [as __zone_symbol__ON_PROPERTYerror] (main-es2015.dc59a351503c7e4f109f.js:1)
    at XMLHttpRequest.T (polyfills-es2015.026fcb2559269e9f129a.js:1)
    at l.invokeTask (polyfills-es2015.026fcb2559269e9f129a.js:1)
    
VM279:1 POST https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/sandbox/blind/get net::ERR_FAILED

我只想让这些愚蠢的 Cors 错误消失,并能够将我的应用程序推送到它所属的堆栈下的云中。我已经删除了所有其他堆栈,因为它们都没有工作。在这些错误上与放大、api 网关和 lambda 作斗争似乎很荒谬。任何人都请向我解释问题出在哪里以及如何解决。我觉得我已经阅读了所有相关和不相关的文章,并且到了一半,却发现我无法部署应用程序。

【问题讨论】:

【参考方案1】:

对于遇到相同问题的其他人。有时它不是真正的 CORS 问题(我知道),但不知道如何调试它。根据 AWS,放大身份验证版本 3.4.4 中存在一个已知错误。

建议的第一步是更改 amplify 配置服务的方式。仅此一项并不能解决问题,我还没有反过来测试它。

import API from '@aws-amplify/api';
import Auth from '@aws-amplify/auth';
import  Amplify  from 'aws-amplify';
import awsconfig from './aws-exports';

Amplify.configure(awsconfig);
Amplify.register(Auth);
Amplify.register(API);

接下来(对于角度)将环境配置中的buildOptimizer 更改为false

"buildOptimizer": false,

完成这些步骤后,我能够将代码推送到云端并按预期登录。和我的本地系统一样。如果上述步骤不起作用,另一个推荐的步骤是将 Amplify Auth 降级为3.3.2

"@aws-amplify/auth": "3.3.2"

【讨论】:

以上是关于使用 Rest API Gateway lambda 集成 CORS 问题进行放大的主要内容,如果未能解决你的问题,请参考以下文章

API Gateway 中控制和管理对 REST API 的访问

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

如何通过 REST API 在 Express Gateway 中使用多个路径和端点?

REST API openapi 规范 AWS API Gateway 与 serverless.com 框架的集成

在 API Gateway 中设置阶段 » 为 REST API 部署设置阶段变量Stage variables

jhipster-gateway API 部分 (swagger-ui) 中未列出 API-first rest 端点