1) Не используйте токен в заголовке. Вместо этого, передавайте его в качестве параметра в POST запросе. На сервере проверяйте токен из POST запроса и возвращайте поток файла с соответствующими заголовками. Пример заголовков:
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=somefile.ext");
header("Content-Transfer-Encoding: binary");
header("Content-Type: binary/octet-stream");
readfile($filePath);
2) Используйте fetch для получения файла с передачей токена в заголовках. На сервере отдавайте файл, а на клиенте преобразуйте его в Blob. Затем, сгенерируйте URL из Blob и создайте скрытую ссылку с этим URL. При клике на ссылку, будет открыто диалоговое окно сохранения файла. Пример заголовков:
fetch(url, {
headers: {
"Authorization": token
}
})
.then(response => response.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const hiddenLink = document.createElement("a");
hiddenLink.href = url;
hiddenLink.download = "filename.ext";
hiddenLink.click();
});
3) С помощью fetch передавайте токен в заголовках. На сервере создайте временную уникальную ссылку с хэшем и верните ее в ответе. В коллбэке на клиенте выполните перенаправление на эту ссылку при помощи window.location. При запросе к ссылке с заголовками из первого варианта, сервер отдаст файл и откроется диалоговое окно сохранения. Важно учесть, что ссылка является одноразовой и используется только один раз для скачивания файла.
Пример кода на сервере:
const hash = generateUniqueHashForToken(token);
const downloadLink = `http://example.com/file/${hash}`;
Пример кода на клиенте:
fetch(url, {
headers: {
"Authorization": token
}
})
.then(response => response.text())
.then(hash => {
const downloadLink = `http://example.com/file/${hash}`;
window.location = downloadLink;
});
Таким образом, вы сможете использовать различные способы получить файл, передавая токен в заголовках и обеспечивая безопасность доступа к файлам.