当我尝试使用 Axios 调用 Instagram API 时,我“被 CORS 政策阻止” [重复]

Posted

技术标签:

【中文标题】当我尝试使用 Axios 调用 Instagram API 时,我“被 CORS 政策阻止” [重复]【英文标题】:I'm getting "blocked by CORS policy" when I try to call Instagram API using Axios [duplicate] 【发布时间】:2019-12-13 13:55:18 【问题描述】:

我正在尝试在一个使用 Vue 作为前端的 Laravel 应用程序中从我的 Instagram 帐户中获取一些图像。当我尝试在独立的 Vue 应用程序中执行此操作时,它运行良好,但是当我使用 Laravel 执行此操作时,我收到一条消息说“已被 CORS 策略阻止:Access 不允许请求标头字段 x-csrf-token - 预检响应中的 Control-Allow-Headers。"

我正在使用 Laravel 5.8 以及内置的 Vue 和 Axios,并且我使用 Homestead 作为我的本地主机服务器。

我尝试了很多在这里和 Google 上找到的技巧,但都没有成功。基本上,我正在尝试最基础的 Axios 调用

        beforeMount() 
            axios.get('https://api.instagram.com/v1/users/self/media/recent/?access_token=[MY_ACCESS_TOKEN]').then(response => console.log(response))
        

我已经在 Laravel 上创建了一个 Cors 中间件,并在 Axios 上尝试了很多标头设置。

我基本上是在尝试检索我的 Instagram 帖子列表并绕过该 cors / x-csrf 错误。

【问题讨论】:

您是否将x-csrf-token 标头添加到Cors.php 文件中的允许列表中。 【参考方案1】:

您对 Instagram 端点的AJAX 请求必须作为jsonp 请求发送,这意味着请求的dataType 必须是jsonp

This blob 包含在axios 中使用jsonp 的示例。

这是一个向 Instagram 端点发送带有 jsonp 数据类型的 AJAX 请求的示例。

$.ajax(
    url: "https://api.instagram.com/v1/users/self/media/recent/?access_token=[MY_ACCESS_TOKEN]",
    type: "GET",
    crossDomain: true,
    dataType: "jsonp",
    success: function(response)
        console.log(response);
    
);

【讨论】:

@hugolcouto 不要忘记给答案投票 :) 这建议为 jQuery 切换 axios。这有点适得其反。 感谢您的建议!我已经安装了 jsonp npm 包并使用它而不是 axios。我没有在上面使用jquery。【参考方案2】:

Laravel 自动将 X-CSRF-TOKEN 标头应用于所有 axios 请求。这样您就可以与您的应用程序进行通信,而不必每次都为 POST、PUT、DELETE 等传递 CSRF 令牌。

resources/js/bootstrap.js(默认设置)

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) 
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
 else 
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');

您应该能够通过执行以下操作删除有问题的标题:

beforeMount() 

    // create a new instance so we don't delete the csrf token for other requests
    let instance = axios.create();

    // delete the x-csrf-token header
    delete instance.defaults.headers.common['X-CSRF-TOKEN'];

    // use the new instance to make your get request
    instance.get('https://api.instagram.com/v1/users/self/media/recent/?access_token=[MY_ACCESS_TOKEN]')
        .then(response => console.log(response))



【讨论】:

以上是关于当我尝试使用 Axios 调用 Instagram API 时,我“被 CORS 政策阻止” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 调用 API 时如何防止 UI 冻结

当我一直得到 401 时,如何使用标题删除 axios?

使用 axios 提取 instagram 数据并且 ?__a=1 半天后被阻止(1 个请求/分钟)

如何使用 axios 从前端调用 uWebSockets http 路由?

Axios POST 调用不适用于 JWT 令牌,而 GET 调用有效

Vue 3 Instagram 动态 - CORS