Vue 3 Instagram 动态 - CORS

Posted

技术标签:

【中文标题】Vue 3 Instagram 动态 - CORS【英文标题】:Vue 3 Instagram Feed - CORS 【发布时间】:2021-11-26 07:00:05 【问题描述】:

我正在尝试使用 Vue 3 和 Axios 从提要中获取最新的 Instagram 帖子。 Instagram 推出了strict-origin-when-cross-origin 政策,所以我一直被屏蔽。访问令牌和一切都已经设置好了。

使用Instagram Basic Display API 的指南并没有什么帮助,大吃一惊。

ma​​in.js

import  createApp  from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

import App from './App.vue'
const app = createApp(App)

app.use(BootstrapVue3, VueAxios, axios)
app.provide('axios', app.config.globalProperties.axios)
app.mount('#app')

App.vue

<template>
    <Home />
</template>

<script>
import  inject  from 'vue'
import Home from './components/Home.vue'

export default 
    name: 'App',
    components:  Home ,
    setup() 
        inject('axios')
    

</script>

Home.vue

export default 
    name: 'Home',
    mounted() 
        axios.get('https://api.instagram.com/me?fields=id&access_token=myToken')
        .then(response => 
            console.dir(response)
        ).catch(err => 
            console.error(err)
        )
    

</script>
Access to XMLHttpRequest at 'https://api.instagram.com/me?access_token=myToken'
from origin 'http://localhost:1234' has been blocked by CORS policy: No 'Access-Control-Allow-Origin'
header is present on the requested resource.

CORS Header Proxy 或 cors-anywhere 当然会有所帮助,但我想正确地做到这一点......而且我不知道如何在 Vue 中实现 CORS Header Proxy :)

【问题讨论】:

“我想正确地执行此操作” 是什么意思?如果 Instagram 尚未为您的客户端域启用 CORS 访问,您将需要使用代理或使用服务器端技术编写应用程序的这一部分。没有其他选择 【参考方案1】:

您试图实现的目标不可能按原样实现,如果是这样,它将被视为浏览器错误。 CORS 旨在限制浏览器将通过 XMLHttpRequest (XHR) 加载的资源。

你有两个选择:

代理请求

正如@Phil 在他们的评论中提到的,您需要通过忽略 CORS 的某个后端代理请求。因此,后端可以发出请求、获取结果并将结果返回给您的 Vue 应用程序。后端逻辑应该非常简单,您也可以在那里使用axios注意:这可能不安全,因为您需要将用户的访问令牌转发到后端。

编写一个浏览器扩展,添加access-control-allow-origin 标头

浏览器扩展能够修改请求和响应标头。编写一个扩展来做到这一点也很简单。你需要一个background script,内容与此类似:

browser.webRequest.onHeadersReceived.addListener((e) => 
  const  tabId, responseHeaders  = e
  // Add logic to ensure that the header modification only happens on _your_ requests
  responseHeaders.push(
    name: 'access-control-allow-origin',
    value: '<your domain>' // You can throw in '*', which is not a valid value but browsers ignore this error
  )
  return  responseHeaders 
,
 urls: ['https://api.instagram.com/*'] ,
['blocking', 'responseHeaders'])

【讨论】:

以上是关于Vue 3 Instagram 动态 - CORS的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 CORS 错误的情况下使用 axios 对 Instagram 进行 api 调用

无法接收来自 Instagram API 的 POST 请求

网站中的 Instagram 动态 - 使用 Instagram 基本显示 API

访问 Instagram 帐户的 dp 并在 Instagram 故事中动态显示

与Vue.js的CORS问题

PUT 请求抛出 403 CORS 错误 Asp.Net Core 3.1 + Vue3 +IIS10