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

use*_*168 15 authentication download angularjs

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

hma*_*tos 5

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

//Add authentication headers as params
var params = {
    access_token: 'An access_token',
    other_header: 'other_header'
};

//Add authentication headers in URL
var url = [url_generating_pdf, $.param(params)].join('?');

//Open window
window.open(url);
Run Code Online (Sandbox Code Playgroud)

  • @hmartos在URL中发送您的令牌会使其被任何窃听您发送到服务器的数据包的人使用.URL永远不会被加密,因此任何人都可以看到.小心不要暴露你的令牌.用甘道夫的话说:"保守秘密,保持安全." (11认同)
  • 最后,我解决了这个问题.我为pdf制作了标准的$ http.get.我返回短暂的url以获得调用,允许使用window.open进行未经身份验证的下载到新窗口.您的解决方案也是可行的 (4认同)
  • 经过一番研究,我发现通过 https 的查询字符串是安全的,无论如何在 URL 中发送任何敏感数据都不是一个好主意(请参阅 http://stackoverflow.com/questions/323200/is-an-https -查询字符串安全)。所以我认为最好的选择是在请求头中发送这个令牌(http://stackoverflow.com/questions/187655/are-https-headers-encrypted) (3认同)
  • 这并不能回答问题。令牌作为查询参数添加,而不是遵循将其添加为标头的原始标准。 (2认同)

hma*_*tos 5

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

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

发出经过身份验证的请求的安全方法是将身份验证令牌设置在请求标头中,并避免将其暴露在URL中,这是我先前的回答所建议的(此后,我学到了一些知识)。

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

  1. 向在标头中发送身份验证令牌的资源发出 HTTP GET请求,将其responseType设置为二进制数据类型,例如 blob或arraybuffer。
  2. 从浏览器使用“另存为”对话框将二进制数据下载到文件中,通常会为二进制数据创建一个下载链接,然后单击它。

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