带有承载头的响应文件

时间:2019-07-05 12:09:19

标签: php laravel laravel-5

如何将授权载体作为标题放入响应文件中?

public function downloadExcel($fileName) {
        ob_end_clean();
        return response()->file(resource_path() . '/file_storage/exports/' . $fileName, ['header' => 'Authorization: Bearer ' . request()->bearerToken])->deleteFileAfterSend(true);
    }

尝试下载Excel文件时,我得到了未授权。我将我的api放在一个用户登录的组中。

2 个答案:

答案 0 :(得分:1)

尝试一下。

public function downloadExcel($pathToFile)
{
    $headers =[
        'Authorization' => 'Bearer XXXXXX',
        'Content-Type' => 'application/pdf',
    ];

    return response()->file($pathToFile, $headers);
}

答案 1 :(得分:1)

问题似乎出在具有使用受oAuth2保护的API的单页应用程序,并且您想让用户下载文件,但这失败了,因为您无法在请求上设置Authorization标头

解决此问题的最佳方法是使用Laravel的signed url's功能。从您的API返回一个签名的URL(例如,仅有效1小时),并且不使用oAuth2中间件而是通过链接的单个url文档(signed中间件)中的说明保护您的下载路径。

您的控制器动作将不仅仅是这样:

public function downloadExcel($fileName)
{
   return response()->file(resource_path() . '/file_storage/exports/' . $fileName)
                    ->deleteFileAfterSend(true);
}

请注意->deleteFileAfterSend(true)部分,因为这将在首次下载后从磁盘上删除文件,这可能是有意的,但我还是想提一下

这是最安全的选项。还有其他一些,但是它们将要求您将访问令牌作为GET参数放入请求中,这是一个非常糟糕的主意,因为GET参数未加密,并且会显示在访问日志中。所以请不要这样做:)