【问题标题】:Vue Auth - No 'Access-Control-Allow-Origin' but he is thereVue Auth - 没有“访问控制允许来源”,但他在那里
【发布时间】:2020-03-18 19:03:52
【问题描述】:

我想使用 Vue Auth、Axios 和 Cakephp 进行身份验证,但我有一个众所周知的错误:

Access to XMLHttpRequest at 'http://dev.zenburo.actuelburo.local:8081/api/users/token' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我也有警告:

Cross-Origin Read Blocking (CORB) blocked cross-origin response http://dev.zenburo.actuelburo.local:8081/api/users/token with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

问题是,我没有内容类型“text / html”,我有标题“Access-Control-Allow-Origin”

此外,所有其他请求都在此 API 上工作。

这是我的代码:

Axios 实例(@/api):

import axios from 'axios'

export default axios.create({
    baseURL: 'http://dev.zenburo.actuelburo.local:8081/api/',
    timeout: 5000,
    headers: {
        'Access-Control-Allow-Origin': 'http://localhost:8080/',
        'Content-Type': 'application/json',
        'Access-Control-Expose-Headers': 'Access-Token',
        'Access-Control-Allow-Credential': 'true',
    }
});

Vue 身份验证配置(@/auth):

import bearer from '@websanova/vue-auth/drivers/auth/bearer'
import axios from '@websanova/vue-auth/drivers/http/axios.1.x'
import router from '@websanova/vue-auth/drivers/router/vue-router.2.x'

const config = {
    auth: bearer,
    http: axios,
    router: router,
    loginData: {
        url: '/users/token',
        redirect: '/dashboard',
        method: 'POST',
    }
};

export default config

main.js:

import Vue from 'vue'
import vuetify from './plugins/vuetify'
import VueRouter from 'vue-router'
import router from './routes'
import api from '@/api'
import VueAxios from 'vue-axios'
import auth from './auth'
import VueAuth from '@websanova/vue-auth'
import Index from './views/Index'
import ECharts from 'vue-echarts'
import store from './store'
import 'echarts/lib/chart/bar'
import 'echarts/lib/component/tooltip'
import 'echarts-gl'


window.Vue = Vue;
Vue.router = router

Vue.component('v-chart', ECharts);
Vue.config.productionTip = false;
Vue.use(VueRouter);

Vue.use(VueAxios, api);

Vue.use(VueAuth, auth);

new Vue({
    vuetify,
    store,
    render: h => h(Index),
    router,
}).$mount('#app');

最后,login.vue:

<template />

<script>
 export default {
        name: "Login",
        data() {
            return {
                account: '',
                password: '',
            }
        },
        methods: {
            login() {
                let self = this
                this.$auth.login({
                    body: {username: self.account, password: self.password},
                    method: 'POST',
                    rememberMe: true,
                    success: function () {
                        console.log('ok');
                    },
                    error: function (error) {
                        console.log(error)
                    },
                })
            }
        }
    }
<script/>

这是没有缓存的网络:

这是客户端还是服务器端的问题? (我再说一遍:除了身份验证之外的所有其他方法都有效;所以我有疑问)

有人有解决办法吗?

提前感谢您的帮助

【问题讨论】:

  • 预检请求怎么样?选项?效果好吗?
  • @AlexisGatuingt,这些标头应该出现在您的 api 的响应中,您的 api 告诉您的浏览器允许客户端网站向您的 api 发出该请求。这是您的api and browser(称为预检)之间的对话。

标签: vue.js axios vue-router vue-cli


【解决方案1】:

问题:响应服务器端。

您必须使用 Access-Control-Expose-Headers 返回响应

header("Authorization: 'YOURTOKEN'");

【讨论】:

  • 两天后,我终于找到了你的答案,并在我的 .htaccess 中添加了 Header set Access-Control-Expose-Headers "Authorization" 非常感谢
  • 嗨@migli!您能否指出我如何在 htaccess 上配置此授权?
  • 这是一个示例代码:&lt;IfModule mod_headers.c&gt; Header set Access-Control-Expose-Headers "Authorization" &lt;/IfModule&gt;
【解决方案2】:

确实,@Gander 的评论非常准确。

是preflight request的问题(传入OPTIONS)。

当您调用本地 API 时经常会发生这种情况。

【讨论】:

    【解决方案3】:

    首先,您混淆了请求标头和响应标头。例如Access-Control-Allow-Origin 应该只是一个响应标头,但您是双向发送的。确保您清楚它们之间的区别,然后检查每个标头以确保您将其发送到正确的方向。

    接下来,在第二张图片中,它清楚地显示了响应中有text/htmlContent-type,与第二条错误消息一致。我再次强调,了解请求标头和响应标头之间的区别很重要。该请求还有一个Content-type 集,但它是完全独立的。

    另一条错误消息指出缺少Access-Control-Allow-Origin 标头。请记住,这是一个响应标头,如果您将其设置为请求标头,则不算数。在第一张图片中,对于飞行前的 OPTIONS 请求,该标头存在,所以一切都很好。然后它会尝试 POST 请求,但这次响应不包含该标头或任何其他 CORS 标头。

    鉴于您的其他请求正在发挥作用,我建议您将此与其他请求进行对比。我怀疑您会看到这些请求存在 Access-Control-Allow-Origin response 标头。

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2018-10-18
      • 2017-07-21
      • 2019-09-16
      • 1970-01-01
      • 2016-06-27
      • 2016-12-18
      • 2016-03-24
      相关资源
      最近更新 更多