我正在尝试从 Stimulus 控制器向 Cloudfront 发送 Fetch GET 请求以及一些签名的 cookie,用于验证我的请求并检索受保护的内容。
问题是,尽管 S3、Cloudfront、Rails 服务器和客户端理论上的设置都是正确的,但 cookie 并未一起发送。
环境
Cloudfront 网址:
https://netflix.tonyfromtokyo.online/mm57enm1nx2u91ztntbu2idxxror/HLS/mm57enm1nx2u91ztntbu2idxxror.m3u8
客户端网址:
http://tonyfromtokyo.online:3000/movies/298486374
。我在我的 /etc/hosts
文件中添加了以下行: 127.0.0.1 tonyfromtokyo.online
,以便我可以从此域而不是 localhost:3000
发送请求。
浏览器上没有发生 CORS 错误。我允许了来自
http://tonyfromtokyo.online:3000
的请求。
cookies[key] = {
value: value,
domain: :all
}
它们已按预期正确设置。
import { Controller } from "@hotwired/stimulus"
// Connects to data-controller="video-player"
export default class extends Controller {
static targets = [ "video" ]
static values = { videoUrl: String }
connect() {
fetch(this.videoUrlValue, { credentials: 'include' }) // No cookies sent. Why?
// https://spekiyoblog.com/how-to-set-cookie-to-hlsjs-request/
const config =
{
xhrSetup: function (xhr, url)
{
xhr.withCredentials = true; // No cookies sent. Why?
},
fetchSetup: function (context, initParams)
{
console.log("fetchSetup");
// Always send cookies, even for cross-origin calls.
initParams.credentials = 'include';
return new Request(context.url, initParams);
},
};
if (Hls.isSupported()) {
console.log("HLS supported");
var hls = new Hls(config);
hls.loadSource(this.videoUrlValue);
hls.attachMedia(this.videoTarget);
this.videoTarget.play();
} else if (this.videoTarget.canPlayType('application/vnd.apple.mpegurl')) {
this.videoTarget.src = this.videoUrlValue;
this.videoTarget.addEventListener('canplay',function() {
this.videoTarget.play();
});
}
}
}
如果有人知道如何解决这个问题,我将非常感激。谢谢。
编辑:请求在 Mozilla 和 Safari 上运行良好(cookie 随请求一起发送,我可以通过签名 cookie 检索文件)。它在 Chrome 和 Brave 中仍然不起作用,但这是向前迈出的一步。
我找到了解决方案。我的 Rails 服务器没有使用 SSL (
http
),因此 cookie 似乎没有作为请求的一部分发送到 Cloudfront。
一开始我并不认为这是一个问题。
当我在本地 Rails 服务器上设置 SSL 后,cookie 就会按预期发送。
下面的文章对于指导我在本地设置 SSL 非常有帮助: https://jfbcodes.medium.com/using-rails-with-ssl-on-localhost-52d60f14a382