Vue Auth - 没有“访问控制允许来源”,但他在那里

Posted

技术标签:

【中文标题】Vue Auth - 没有“访问控制允许来源”,但他在那里【英文标题】:Vue Auth - No 'Access-Control-Allow-Origin' but he is there 【发布时间】: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(称为预检)之间的对话。 【参考方案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 标头。

【讨论】:

以上是关于Vue Auth - 没有“访问控制允许来源”,但他在那里的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2,没有“访问控制允许来源”

Django Angular cors错误:不允许访问控制允许来源

Angular 和 Golang “没有访问控制允许来源......”

Laravel 生产,CORS 没有“访问控制允许来源”标题

aws-sdk bucket.getObject:没有“访问控制允许来源”错误

SOAP 请求的问题。 '访问控制允许来源'