如何将身份验证标头添加到$ window.open

时间:2014-04-17 16:31:19

标签: angularjs authentication download

我有angularjs应用程序,用户输入保存到数据库的数据,然后在服务器端将其编译为pdf文件。所有访问都需要适当的身份验证标头。在填写所需数据后,用户按下按钮以保存数据,然后检索pdf文件。最好,我在angularjs应用程序中调用$window.open(url_generating_pdf)。这很好用,并在另一个窗口中打开,但如何在此$window请求中添加身份验证标头?根据我的理解,我无法下载pdf,并使用ajax打印,所以我错过了这种身份验证。或者是否有其他方法可以从服务器调用url,并在另一个窗口中打开文件?

3 个答案:

答案 0 :(得分:5)

我认为您可以在URL中添加此身份验证参数,并在服务器端执行GET

INSERT INTO "RANDOM_TABLE" ("TEXT_VALUE") 
VALUES ('BRAF >> V600E (73%)' + CHAR(13) + CHAR(10) + 'PIK3CA >> E545G (31%)');

答案 1 :(得分:3)

我认为我应该用正确且安全的答案来更新这个旧问题。

您无法在window.open 执行的HTTP GET请求中添加任何标头。

发出经过身份验证的请求的安全方法是将身份验证令牌设置为请求标头,并避免将其暴露于URL中,如我先前的回答所建议的(自从我学到了一些东西然后)。

要使用AngularJS从经过身份验证的服务器下载PDF(或其他二进制数据),您应该:

  1. 对资源sending the authentication token in a header发出HTTP GET请求,将其responseType设置为二进制数据类型,例如 blob arraybuffer
  2. Download the binary data in a file,使用浏览器中的“另存为”对话框,通常会为二进制数据创建一个下载链接,然后单击它。

我希望此答案可以消除对此问题的疑虑,并提供一种从经过身份验证的REST API下载资源的安全方式。

答案 2 :(得分:0)

您可以在标头和responseType中使用带有令牌的安全api来调用blob,并按照以下方式解析响应,希望您可以在浏览器中查看chrome和firefox的pdf。

var ieEDGE = navigator.userAgent.match(/Edge/g);
        var ie = navigator.userAgent.match(/.NET/g); // IE 11+
        var oldIE = navigator.userAgent.match(/MSIE/g);

        var blob = new window.Blob([response], { type: 'application/pdf' });

        if (ie || oldIE || ieEDGE) {
          window.navigator.msSaveBlob(blob, fileName);
        }
        else {
          var fileURL = URL.createObjectURL(blob);
          window.open(fileURL);
        }