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

问题描述

使用放大我设置了一个快速的无服务器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()
});

我通过放大创建其余网关,还添加一个路径并选择“仅经过身份验证的用户”,然后推送网关。我不知道它是否必要,但我也转到网关内部的路由,然后单击“启用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文件(如下所示),则在我的角度应用程序(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)上配置角度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'删除上述错误消息,但是会直接导致lasda出现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似乎是荒谬的。任何人请向我解释问题出在哪里以及如何解决。我觉得我已经阅读了所有相关和不相关的文章,并且半途而废,只是发现我无法部署该应用程序。

解决方法

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

建议的第一步是更改放大配置服务的方式。仅此一项并不能解决问题,我还没有进行其他测试。

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"