ses.sendmail() 给出 CORS 错误。响应中的“Access-Control-Allow-Origin”标头不得为通配符“*”。凭证模式为“包含”

     2023-03-27     94

关键词:

【中文标题】ses.sendmail() 给出 CORS 错误。响应中的“Access-Control-Allow-Origin”标头不得为通配符“*”。凭证模式为“包含”【英文标题】:ses.sendmail() gives CORS error. 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*'..credentials mode is 'include' 【发布时间】:2021-05-09 08:11:36 【问题描述】:

我已经坚持了 4 天了。我真的需要一些见解。

我在 AWS 上部署了一个无服务器 express 应用程序。我从 S3 为我的前端提供服务,从 lambda 提供后端服务。 API 网关具有代理,如下面的 serverless.yml 所示。

我还使用 Cloudfront 将我的域 (https://my.domain.com.au) 映射到 S3 存储桶原始 URL。

正常的 GET POST PUT DELETE 请求工作正常。但是当我尝试从 Lambda 访问任何其他 AWS 服务时,我会收到以下 CORS 错误。

Access to XMLHttpRequest at 'https://0cn0ej4t5w.execute-api.ap-southeast-2.amazonaws.com/prod/api/auth/reset-password' from origin 'https://my.domain.com.au' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

我的用例是从我尝试使用的应用发送邮件。

ses.sendEmail(params).promise();

这给了我同样的错误。所以我尝试通过 lambda 调用它,同样的错误。现在我正在尝试将邮件内容推送到 S3 并使用触发器从 lambda 发送邮件,但这给了我同样的错误。

问题似乎不在代码上,因为它在本地环境中完美运行。但是,我不想留下任何石头。

由于我的 lambda 在 VPC 中,我使用了互联网网关并尝试设置私有链接。

无服务器.yml

service: my-api

# plugins 
plugins:
  - serverless-webpack
  - serverless-offline
  - serverless-dotenv-plugin

# custom for secret inclusions
custom:
  stage: $opt:stage, self:provider.stage
  serverless-offline:
    httpPort: 5000
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: # enable auto-packing of external modules
      forceInclude:
        - mysql
        - mysql2 
        - passport-jwt
        - jsonwebtoken
        - moment
        - moment-timezone
        - lodash

# provider
provider:
  name: aws
  runtime: nodejs12.x
  # you can overwrite defaults here
  stage: prod
  region: $env:AWS_REGION_APP
  timeout: 10
  iamManagedPolicies:
    - 'arn:aws:iam::777777777777777:policy/LambdaSESAccessPolicy'
  vpc:
    securityGroupIds:
      - $env:AWS_SUBNET_GROUP_ID
    subnetIds:
      - $env:AWS_SUBNET_ID1
      - $env:AWS_SUBNET_ID2
      - $env:AWS_SUBNET_ID3
  environment:
    /// env variables (hidden)
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - s3:*
        - ses:*
        - lambda:*
      Resource: '*'

# functions
functions:
  app:
    handler: server.handler
    events:
      - http:
          path: /
          method: ANY
      - http:
          path: /proxy+
          method: ANY
          cors:
            origin: $env:CORS_ORIGIN_URL
            allowCredentials: true
            headers: 'Access-Control-Allow-Origin, Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization'
            method: ANY

# you can add CloudFormation resource templates here
resources:
  # API Gateway Errors
  - $file(resources/api-gateway-errors.yml)
  # VPC Access for RDS
  - $file(resources/lambda-vpc-access.yml)

我也配置了响应头:

app.use(function(req, res, next) 
    res.header("Access-Control-Allow-Origin", process.env.CORS_ORIGIN_URL);
    res.header("Access-Control-Allow-Headers", "Access-Control-Allow-Origin, Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
    res.header("Access-Control-Allow-Credentials", "true");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT,DELETE");
    next();
);

【问题讨论】:

【参考方案1】:

我实际上和你有同样的错误,但我已经弄清楚了。

我只是粘贴我的代码,因为你没有显示你的 lambda 函数是什么样子的。

我也知道已经过去了两周...所以希望这对将来的人有所帮助。

CORS 错误是服务器端的,我相信您知道。 AWS SES 的问题是您必须正确处理 lambda,否则即使您有正确的标头,它也会给您一个 cors 错误。

首先要做的事情...我认为您的 api 网关中没有 OPTIONS 方法...尽管我不确定是否可以替代任何方法。

第二个是我的代码: 我检查我得到的 http 方法,然后我根据它做出响应。我收到一个帖子事件,正文中有一些细节。您可能希望将 finally 块更改为其他内容。 OPTIONS 对 CORS 很重要,它让浏览器知道可以发送 POST 请求(或者至少我是这么认为的)

var ses = new AWS.SES();

var RECEIVER = 'receiver@gmail.com';
var SENDER = 'sender@gmail.com';

exports.handler = async(event) => 

  let body;
  let statusCode = '200';
  const headers = 
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'GET,DELETE,POST,PATCH,OPTIONS',
    'Access-Control-Allow-Credentials': true,
    'Access-Control-Allow-Headers': 'access-control-allow-credentials,access-control-allow-headers,access-control-allow-methods,Access-Control-Allow-Origin,authorization,content-type',
    'Content-Type': 'application/json'
  ;
  console.log(event);

  try 
    switch (event.httpMethod) 
      case 'POST':
        event = JSON.parse(event.body);
        var params = 
          Destination: 
            ToAddresses: [
              RECEIVER
            ]
          ,
          Message: 
            Body: 
              Html: 
                Data: html(event.name, event.phone, event.email, event.message), // 'Name: ' + event.name + '\nPhone: ' + event.phone + '\nEmail: ' + event.email + '\n\nMessage:\n' + event.message,
                Charset: 'UTF-8'
              
            ,
            Subject: 
              Data: 'You Have a Message From ' + event.name,
              Charset: 'UTF-8'
            
          ,
          Source: SENDER
        ;
        await ses.sendEmail(params).promise();
        break;
      case 'OPTIONS':
        statusCode = '200';
        body = "OK";
        break;
      default:
        throw new Error(`Unsupported method "$event.httpMethod"`);
    
  
  catch (err) 
    statusCode = '400';
    body = err.message;
  
  finally 
    body = "\"result\": \"Success\""
  
 
  console.log(
    statusCode,
    body,
    headers,
  )
  return 
    statusCode,
    body,
    headers,
  ;


【讨论】:

在 Firefox 上,CORS 请求给出错误“:”(冒号)

】在Firefox上,CORS请求给出错误“:”(冒号)【英文标题】:OnFirefox,CORSrequestgiveserror":"(colon)【发布时间】:2014-10-0410:12:19【问题描述】:在Chrome上,我可以毫无问题地提出跨域请求,但是在Firefox(Ubuntu14.04)上,我收到... 查看详情

在我的 express 中为 node.js 设置了 cors 但仍然给出关于 cors 的相同错误

】在我的express中为node.js设置了cors但仍然给出关于cors的相同错误【英文标题】:Setcorsinmyexpressfornode.jsalreadybutstillgivethesameerroraboutcors【发布时间】:2017-11-1600:59:29【问题描述】:我已经尝试在我的express应用中设置cors,但它仍然... 查看详情

React Ajax Request 给出 CORS 错误但返回数据

】ReactAjaxRequest给出CORS错误但返回数据【英文标题】:ReactAjaxRequestgivesCORSerrorbutreturnsthedata【发布时间】:2018-06-0713:58:51【问题描述】:我正在尝试发出GET请求,通过POSTMAN可以正常工作,但在react上似乎不起作用。由于某种原因... 查看详情

对 Url 的发布请求给出了被 cors 策略阻止的错误 [重复]

】对Url的发布请求给出了被cors策略阻止的错误[重复]【英文标题】:thepostrequesttoUrlgiveserrorblockedbycorspolicy[duplicate]【发布时间】:2021-09-1814:04:45【问题描述】:我正在尝试向URL="https://sambhav.daily.co/v1/rooms"发出发布请求,但... 查看详情

从 Angular 9 调用 AWS api 给出 cors 错误

】从Angular9调用AWSapi给出cors错误【英文标题】:CalltoAWSapifromAngular9givingcorserror【发布时间】:2020-12-0623:39:03【问题描述】:我正在Angular9中编写一个调用AWSAPI的post方法。但是,当我在Angular9中调用post函数:this.http.post(url,body,reques... 查看详情

React w/Kubernetes 部署的 API 给出了 cors 错误

】Reactw/Kubernetes部署的API给出了cors错误【英文标题】:Reactw/KubernetesdeployedAPIgivingcorserror【发布时间】:2021-01-0417:42:08【问题描述】:这与其他cors相关的问题不同我正在部署在Digitalocean上的kubernetes上的微服务上运行我的节点后端... 查看详情

Angular 的 Spring Boot 授权服务器访问 - 不断给出 CORS 错误

】Angular的SpringBoot授权服务器访问-不断给出CORS错误【英文标题】:SpringbootAuthorisationserveraccessbyAngular-keepsongivingCORSerrors【发布时间】:2018-08-0415:25:02【问题描述】:使用“ngserve”我启动了一个Angular应用程序。Angular应用程序使用... 查看详情

AWS S3 / EC2:使用文件保护程序下载文件给出 CORS 错误

】AWSS3/EC2:使用文件保护程序下载文件给出CORS错误【英文标题】:AWSS3/EC2:Downloadingfilewithfile-savergivingCORSerror【发布时间】:2019-07-1719:36:57【问题描述】:我正在使用AWSS3托管我的网站并使用以下CORS设置设置我的存储桶:<?xmlver... 查看详情

为啥 CORS 在不同的内容类型上给出不同的响应

】为啥CORS在不同的内容类型上给出不同的响应【英文标题】:WhyCORSgivesdifferentresponseatdifferentcontent-types为什么CORS在不同的内容类型上给出不同的响应【发布时间】:2017-06-1504:27:29【问题描述】:在没有请求内容类型的情况下调... 查看详情

Yii2 和 reactjs CORS 过滤器给出错误:预检响应具有无效的 HTTP 状态代码 401

】Yii2和reactjsCORS过滤器给出错误:预检响应具有无效的HTTP状态代码401【英文标题】:Yii2andreactjsCORSfiltersgivesError:ResponseforpreflighthasinvalidHTTPstatuscode401【发布时间】:2017-09-1808:24:29【问题描述】:我正在尝试在reactJs中使用ajax请求... 查看详情

从在一台机器上工作的浏览器下载 S3 图像并在另一台机器上给出 CORS 错误

...在一台机器上工作的浏览器下载S3图像并在另一台机器上给出CORS错误【英文标题】:DownloadingS3imagefrombrowserworkingononemachineandgivingCORSerroronanothermachine【发布时间】:2019-03-1820:21:06【问题描述】:我有一个Angular2应用程序,我正在尝... 查看详情

Angular 7:发送 post 请求给出错误 405(不允许的方法)

】Angular7:发送post请求给出错误405(不允许的方法)【英文标题】:Angular7:Sendingpostrequestgiveserror405(Methodnotallowed)【发布时间】:2020-01-1501:15:10【问题描述】:我在Chrome上有CORS扩展,GET请求工作正常,但POST请求没有。我收到错误... 查看详情

烧瓶 socketio CORS

...烧瓶发送数据。我需要从不同的来源访问这些数据,但它给出了CORS错误。我尝试过使用各种跨来源的东西,但都没有奏效。有人可以帮忙吗?应该调用thinksocketio的视图:fromflask.ext.corsimportcross_origin@socketio.on( 查看详情

重定向被 CORS 阻止

...PI向adfs服务器发送重定向,其中包含状态为302的URL,但它给出了以下错误XMLHttpRequest无法加载资源A。从资源A重定向到资源B已被CORS策略阻止:否请求中存在“Access-Control-Allow-Origi 查看详情

如何提出 CORS 请求

...完成API来查找城市并获取该城市的数据。问题是,每次我给出一个城市名称(例如:德黑兰),xhr.onerror事件处理程序都会运行并且我得到这个错误:XMLHtt 查看详情

AWS CDK API Gateway 启用 Cors

...IGateway启用Cors,我似乎做的一切都正确,但反应前端仍然给出cors错误。我的cdk代码如下所示。在chrome浏览器中粘贴相同的url是可行的。我正在为lambda、apigateway等使用AWS1.90版,无法升级。 查看详情

Breeze executeQuery Q 承诺失败 CORS

...预期工作得很好,但是当我尝试使用它时,它会失败并且给出“OK”的错误信息:[Q]Unhandledr 查看详情

我正在使用 angularjs 和 django-cors-headers 然后给出“这对于需要预检的跨域请求是不允许的。”

】我正在使用angularjs和django-cors-headers然后给出“这对于需要预检的跨域请求是不允许的。”【英文标题】:iamusingangularjsanddjango-cors-headersthengive"whichisdisallowedforcross-originrequeststhatrequirepreflight."【发布时间】:2017-01-0910:33:5... 查看详情