【问题标题】:How can I download a file from OneDrive into Angular application using Typescript?如何使用 Typescript 将文件从 OneDrive 下载到 Angular 应用程序中?
【发布时间】:2022-01-07 18:48:30
【问题描述】:

我有一个 Angular 应用程序,它使用 OneDrive/Sharepoint 来存储它创建的文件。身份验证工作正常,我可以成功保存文件。我在下载使用 Angular HttpClient 创建和存储的文件时遇到问题。

我的代码如下所示:

export class MicrosoftService {

   private graphUri = 'https://graph.microsoft.com/v1.0';

   constructor(private http: HttpClient) {}

   public loadFile(id: string, next: (saved: string) => void): void {
  
        this.http.get(this.graphUri + '/me/drive/items/' + id + '/content', { headers: this.getOAuthHeader() })
             .subscribe((response: any) => {
                console.log(response.toString());
                next(response.toString());
            });
    }

    getOAuthHeader(): HttpHeaders {
       // a bunch of stuff that generates the OAuth headers, definitely works
    }

}

很明显,当我收到回复时,我会做其他事情。

问题是,当GET 请求被触发时,它会正确地发出图形请求,然后returns a 302 redirecthttps://foozlecorporation-my.sharepoint.com/drive/path/_layouts/15/download.aspx?UniqueId=a-bunch-of-url-params - 这也是正确的,我可以从 REST 客户端下载内容,但是在浏览器(当前使用 Safari)重定向引发 Browser cannot load [...url...] due to access control checks 错误。

我的应用程序标头中有Access-Control-Allow-Origin: *,这大概是我首先可以使用Graph 的原因,但Sharepoint 响应不包括Access-Control-Allow-Origin。我还需要做什么?

【问题讨论】:

  • 您在不使用 Safari 时是否遇到同样的错误?我注意到有时 Safari 会以不同的方式解释此错误,而其他浏览器会提供更好的洞察力
  • @jub0bs 它没有添加任何Access-Control-Allow-Origin 标头。
  • @glenatron 你的问题。当 CORS 请求以跨域重定向响应时,将对新目标源执行新的 CORS 访问控制检查。如果有问题的服务器没有为 CORS 配置,那么你就不走运了。
  • @Jub0bs,我已经编辑了这个问题,你为什么不重新格式化你的评论作为答案,以便有更清晰的记录。

标签: angular typescript safari cors sharepoint-rest-api


【解决方案1】:

问题

You write 端点 https://foozlecorporation-my.sharepoint.com/drive/path/_layouts/15/download.aspx?UniqueId=a-bunch-of-url-params 没有响应任何 Access-Control-Allow-Origin 标头。

当您从源 A 向源 B (https://graph.microsoft.com) 上的某个端点发送 CORS 请求时,响应允许源 A 但导致 跨源 重定向到某个端点源 C (https://foozlecorporation-my.sharepoint.com),浏览器对源 C 上的源 A 执行新的 CORS 访问控制检查。如果源 C 未为 CORS 配置或不允许源 A,则您的整体 CORS 请求将失败。

可能的解决方案

一种解决方案是从后端而不是前端调用https://graph.microsoft.com;这样一来,由于 CORS 不适用于非浏览器用户代理,您就可以回避这个问题。

【讨论】:

  • 我认为你的解决方案可能是我将不得不去的 - 拦截 302 然后代理请求是不优雅的,但它似乎是唯一可行的方法。
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多