在部署的应用程序上播放来自 s3 的文件时出现跨源资源策略问题

2024-01-20

我在 Heroku 上部署了一个应用程序,可以让我播放音频文件。你可以在这里查看https://telecurve.herokuapp.com/manage https://telecurve.herokuapp.com/manage。在我在 Heroku 中播放文件没有问题之前,但在修改了 server.js 文件之后(我的应用程序是一个 Express 应用程序,使用内置的 Create React 应用程序部署),我收到此错误。您可以尝试播放音频文件并查看响应。但是,我仍然可以使用下载按钮从 s3 下载文件,没有任何问题。

这是一些相关代码:

server.js

    require('rootpath')();
    const path = require('path');
    const express = require('express');
    const app = express();
    const bodyParser = require('body-parser');
    const cookieParser = require('cookie-parser');
    const cors = require('cors');
    
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());
    app.use(cookieParser());
    
    // Have Node serve the files for our built React app
    app.use(express.static(path.resolve(__dirname, 'build')));
    
    // allow cors requests from any origin and with credentials
    app.use(cors({ origin: (origin, callback) => callback(null, true), credentials: true }));
    
   //change added that caused issues with the playing mechanism. Needed these headers for another 
    app.use(function(req, res, next) {
      res.header("Cross-Origin-Embedder-Policy", "require-corp");
      res.header("Cross-Origin-Opener-Policy", "same-origin");
      next();
    });
    
    
    // file api routes
    app.use('/accounts', require('./accounts/accounts.controller'));
    
    
    // All other GET requests not handled before will return our React app
    app.get('*', (req, res) => {
        res.sendFile(path.resolve(__dirname, 'build', 'index.html'));
    });
    
    app.get('/app', async (req, res) => {
      res.sendFile(path.join(__dirname, 'public/index.html'));
    });
    // does work, cors headers in response as expected
    
    
    // start server
    const port = process.env.PORT || 2000;
    app.listen(port, () => console.log('Server listening on port ' + port));

这是我在 server.js 中添加的特定更改:

   //change added that caused issues with the playing mechanism. Needed these headers for another 
    app.use(function(req, res, next) {
      res.header("Cross-Origin-Embedder-Policy", "require-corp");
      res.header("Cross-Origin-Opener-Policy", "same-origin");
      next();
    });

也许我需要为 s3 添加额外的标头?

我最近还删除了这段代码:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

这是我在后端的预签名方法,我用它来生成播放/下载的网址:

  const customer_id = data['customer-id'];
  const sound_id = data['sound-id'];
  
  return new Promise((resolve, reject) => {
    //get presigned url

    var myBucket = process.env.NODE_APP_BUCKET_NAME;
    var myKey = "sounds/" + customer_id + "/" + sound_id + ".wav"; 
    const signedUrlExpireSeconds = 120;
    try {
      const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myKey,
        ResponseContentDisposition: 'attachment',
        Expires: signedUrlExpireSeconds
      });
      resolve(url)
    }
    catch {
      console.log('S3 Object does not exist');
      resolve('');
    }
  });

然后我使用这个 url 创建一个新的音频对象var audio = new Audio(url)并播放它。

如果您发现任何问题或我遗漏了什么,请告诉我。


您似乎直接使用指向 S3 上音频文件的 URL,这意味着:

  • 您的音频(在您的网页看来)是跨源资源。和Cross-Origin-Embedder-Policy https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy set to require-corp,添加一个crossorigin https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin归因于你的<audio/>(包括Audio对象)是必需的。
  • 如前所述,您的存储桶可能需要配置 CORS 以允许您的站点访问它在另一个问题中 https://stackoverflow.com/q/49573154/14274597. The AWS 文档 https://docs.aws.amazon.com/AmazonS3/latest/userguide/enabling-cors-examples.html解释了如何配置它。

当我写这篇文章时,您的应用程序已关闭,因此我无法实际验证它是由 S3 跨源资源引起的,但根据您的问题,这是最有可能的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在部署的应用程序上播放来自 s3 的文件时出现跨源资源策略问题 的相关文章

随机推荐

  • ASP.NET奇怪的编译错误

    我不知道我的机器出了什么问题 但有一段时间我从 ASP NET 对于我的所有应用程序 收到以下奇怪的错误 Compilation Error Description An error occurred during the compilat
  • 通过匹配两列的值来过滤数据框

    我在 r 中有一个数据框 我想删除两列中字符串值相等的那些行 我在 r 中使用了 match 函数 但无法获得所需的输出 例如我的数据框是 ALDH1A1 ALDH1A1 ITGA7 CHRNA1 PPP1R9A ACTG1 SRGN SR
  • 无法安装漂亮

    我无法 pip install Prettytable 安装它的最佳选择是什么 sudo pip vvv install prettytable Downloading unpacking prettytable Getting page
  • 通过 Intent 发送 Arraylist

    我怎样才能收到定制ArrayList从另一个活动通过Intent 例如 我有这个ArrayList在活动A中 ArrayList
  • 捕获生成器内的错误并随后继续

    我有一个应该运行几天的迭代器 我希望捕获并报告错误 然后我希望迭代器继续 或者整个过程可以重新开始 这是函数 def get units self scraper units scraper get units i 0 while True
  • 正则表达式接受命令并分割命令、参数和参数值

    下午好 我认为我在这项特殊任务中有点超出了我的能力范围 我正在尝试创建一个正则表达式匹配函数来输入命令 并拆分命令名称 参数和参数值 新变量 Name Something Force 结果应该是 新变量 Name 某物 Force 到目前为
  • 从字符串中删除隐藏字符

    我的问题 我有一个通过电子邮件发送新闻通讯的 NET 应用程序 在 Outlook 中查看新闻通讯时 Outlook 会显示一个问号来代替它无法识别的隐藏字符 这些隐藏字符来自最终用户 他们将组成时事通讯的 html 复制并粘贴到表单中并提
  • 表单识别器无效模型状态[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我们通过以下步骤尝试了表单识别器自定义训练 API 2 0 https pnagarjuna wordpress com 2020
  • android:将Tab的单击颜色设置为TableRow的背景颜色

    我有一个选项卡布局 我有一个带有动态添加行的表格布局 当选择 单击 TableRow 时 我想将其背景颜色设置为选项卡的按下或单击颜色 我不想设置任何静态颜色 但想使用默认主题颜色 如何获取 Tablayout 的颜色信息 How to h
  • Delphi中如何检查两个事件是否指向同一个过程?

    假设我有一个链接到 Button1Click 过程的 Button1 OnClick 事件 我还有 Button2 OnClick 链接到其他一些程序 如何检查这两个事件是否从运行时链接到不同或相同的过程 我尝试测试是否 Button1 O
  • 与串口“Verifone VX520”通信

    我正在通过串口将数据发送到 Verifone VX520 支付设备 这是我第一次尝试与此类设备进行通信 SerialObj Open 字符串输入 02hPUR 10 99 000000000004 634 4761739001010010F
  • XSL 用插入符替换空格

    更新的代码
  • 根据用户在 ASP.net 中的设置定期发送邮件?

    在我的网络应用程序中 我想根据用户自己预先选择的时间段为用户发送邮件 例如 每 3 天向用户 01 发送 1 封 HTML 邮件 每 20 天向用户 02 发送 1 封 HTML 邮件我怎样才能做到这一点 有资源吗 我可以通过我的应用程序从
  • com.hazelcast.nio.serialization.HazelcastSerializationException

    我正在运行一个 OSGI 插件项目 没有捆绑包 我在其中集成了 hazelcast 我 当我尝试将数据添加为字符串和测试 bean 的映射时 它被添加到淡褐色投射映射中 但是 二 当我尝试获取地图时 它显示错误如下 com hazelcas
  • Chrome扩展如何在扩展目录中写入文件

    这只是一个关于 chrome 扩展文件写入的简单问题 是否可以在chrome扩展目录中写入文件 我的意思是在我拥有清单文件和其他脚本的同一文件夹中写入一个文件 到目前为止 我发现我可以通过 XMLHttpRequest 读取目录中的文件 但
  • 关键点描述符 OpenCV

    我试图了解如何获取给定的描述符KeyPoint在 OpenCV 中 到目前为止 我的代码如下所示 include
  • Android Studio 和 Ryzen CPU?

    我知道它可能会被标记为重复 但没有一个线程对我有帮助 所以我决定自己做一个 I m a Java后端开发人员我决定学习一些 Android 的东西 几年前我在 Android Studio 工作过i5 4570处理器 然后我放弃了 现在我发
  • 使用 Entity Framework 和 Linq 进行动态排序

    我有另一个类似的问题在这里得到了回答 关于 NULL 值是订单的最后一个 在 Dynamic Linq Order By 上将 NULL 行保留在最后 https stackoverflow com questions 42277259 k
  • 我们如何使用 C# 将二进制数转换为八进制数?

    嘿 我正在开发一个应用程序 它将任何基数 如 2 8 10 16等 转换为用户所需的基数系统 我在将二进制数转换为八进制数时遇到问题 有人可以帮我吗 我尝试了一切 i am taking a binary number in value a
  • 在部署的应用程序上播放来自 s3 的文件时出现跨源资源策略问题

    我在 Heroku 上部署了一个应用程序 可以让我播放音频文件 你可以在这里查看https telecurve herokuapp com manage https telecurve herokuapp com manage 在我在 He