Back to Blog

Fix Vue - Access to XMLHttpRequest from origin has been blocked by CORS policy:

Access to XMLHttpRequest from origin has been blocked by CORS policy. Easy fix for Vue.js.

Fix Vue - Access to XMLHttpRequest from origin has been blocked by CORS policy:

Cross-Origin Resource Sharing (CORS) is a fundamental security feature implemented by browsers to control how web applications interact with resources from different origins. When building Vue.js applications that interact with external APIs, you might encounter CORS errors that prevent your app from functioning correctly. This blog post delves into understanding CORS, diagnosing common issues in Vue.js applications, and provides solutions, including leveraging corsproxy.io for production environments.

Table of Contents

  1. Understanding CORS
  2. CORS in Vue.js Applications
  3. Common CORS Errors and Their Causes
  4. Handling CORS in Development
  5. Resolving CORS Issues in Production with corsproxy.io
  6. Best Practices to Avoid CORS Issues
  7. Conclusion

Understanding CORS

Cross-Origin Resource Sharing (CORS) is a security mechanism enforced by browsers that allows controlled access to resources located outside of a given domain. Essentially, CORS defines a way in which a browser and server can interact to determine whether to allow a cross-origin request.

Key Concepts:

  • Same-Origin Policy (SOP): By default, web browsers restrict cross-origin HTTP requests initiated by scripts for security reasons. SOP permits scripts running on pages originating from the same site to access each other’s resources without restriction.

  • CORS Headers: Servers can include specific HTTP headers to indicate whether a browser should permit frontend JavaScript code to access a given resource.

    • Access-Control-Allow-Origin: Specifies which origins are allowed to access the resource.
    • Access-Control-Allow-Methods: Specifies the methods allowed when accessing the resource.
    • Access-Control-Allow-Headers: Specifies the headers allowed when making the actual request.

Understanding these headers is crucial for troubleshooting and resolving CORS issues.

CORS in Vue.js Applications

When developing Vue.js applications that interact with external APIs, especially during development, you might run into CORS issues. These issues typically arise when your Vue app (running on, say, http://localhost:8080) tries to access resources from a different domain (e.g., https://api.example.com).

Typical Scenario:

  1. Frontend: Vue.js application running on http://localhost:8080.
  2. Backend/API: External API hosted at https://api.example.com.

When the Vue app makes an HTTP request to the API, the browser checks the CORS headers sent by the API to determine if the request should be allowed.

Common CORS Errors and Their Causes

Here are some common CORS-related errors you might encounter in your Vue.js application:

  1. No ‘Access-Control-Allow-Origin’ Header:

    • Error Message: Access to fetch at 'https://example.com/api' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    • Cause: The server does not include the Access-Control-Allow-Origin header in its response, or it does not allow the requesting origin.
  2. Method Not Allowed:

    • Error Message: Method OPTIONS is not allowed by Access-Control-Allow-Methods in preflight response.
    • Cause: The server does not permit the HTTP method (e.g., PUT, DELETE) used in the request.
  3. Headers Not Allowed:

    • Error Message: Request header field X-Custom-Header is not allowed by Access-Control-Allow-Headers in preflight response.
    • Cause: The server does not include the custom headers in the Access-Control-Allow-Headers response.
  4. Credential Issues:

    • Error Message: Credential is not supported if the CORS header 'Access-Control-Allow-Origin' is '*'.
    • Cause: The server allows credentials (cookies, HTTP authentication) but sets Access-Control-Allow-Origin to *, which is not permitted.

Handling CORS in Development

During development, CORS issues can be particularly frustrating. Fortunately, there are several strategies to mitigate these issues:

1. Using Vue CLI’s Proxy Feature

Vue CLI provides a built-in proxy feature that can help bypass CORS restrictions by proxying API requests through the development server.

Setup:

  1. Create or Modify vue.config.js:

    // vue.config.js
    module.exports = {
      devServer: {
        proxy: {
          '/api': {
            target: 'https://api.example.com',
            changeOrigin: true,
            pathRewrite: { '^/api': '' },
          },
        },
      },
    };
  2. Make API Requests via Proxy:

    Instead of making requests directly to https://api.example.com, prefix your API calls with /api. For example:

    axios.get('/api/data')
      .then(response => {
        console.log(response.data);
      })
      .catch(error => {
        console.error(error);
      });

Advantages:

  • Simple to set up.
  • Keeps API calls consistent across development and production.

Limitations:

  • Only effective during development.
  • Not a solution for production environments.

2. Configuring the Backend Server

If you have control over the backend server, configuring it to include the appropriate CORS headers is the most robust solution.

Example (Express.js Server):

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors({
  origin: 'http://localhost:8080',
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  credentials: true,
}));

app.get('/data', (req, res) => {
  res.json({ message: 'CORS is configured properly!' });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Advantages:

  • Provides fine-grained control over CORS policies.
  • Scales well across different environments.

Limitations:

  • Requires access and permission to modify the backend server.
  • Not applicable when consuming third-party APIs.

Resolving CORS Issues in Production with corsproxy.io

While development environments offer multiple avenues to address CORS issues, production scenarios often present additional challenges, especially when interacting with third-party APIs that you cannot configure. In such cases, using a proxy service like corsproxy.io becomes essential.

What is corsproxy.io?

corsproxy.io is a free proxy service that enables you to bypass CORS restrictions by proxying your API requests. It adds the necessary CORS headers to the responses, allowing your Vue.js application to access resources from different origins seamlessly.

How to Use corsproxy.io in Your Vue.js Application

  1. Identify the API Endpoint:

    Suppose you want to access https://example.com/api.

  2. Prefix the API URL with corsproxy.io:

    The proxied URL becomes https://corsproxy.io/?url=https://example.com/api.

  3. Update Your Vue.js Code:

    Modify your API calls to route through corsproxy.io.

    axios.get('https://corsproxy.io/?url=https://example.com/api')
      .then(response => {
        console.log(response.data);
      })
      .catch(error => {
        console.error(error);
      });

Benefits of Using corsproxy.io

  • Ease of Use: Simple to integrate without needing to set up your own proxy server.
  • Free Service: Accessible without additional costs for most use cases.
  • No Backend Configuration Needed: Ideal when you cannot modify the external API’s CORS settings.

Considerations and Best Practices

  • Performance: Introducing a proxy can add latency. Monitor your application’s performance to ensure it meets your requirements.
  • Reliability: Relying on a third-party service means you depend on its uptime and reliability. For mission-critical applications, consider hosting your own proxy.
  • Security: Be cautious when proxying sensitive data. Ensure that corsproxy.io is trustworthy and that you’re not exposing sensitive information.

Example: Implementing corsproxy.io in Vue.js

// src/services/api.js
import axios from 'axios';

const CORS_PROXY = 'https://corsproxy.io/?url=';
const API_BASE_URL = 'https://api.example.com';

export const fetchData = async () => {
  try {
    const response = await axios.get(`${CORS_PROXY}${API_BASE_URL}/data`);
    return response.data;
  } catch (error) {
    console.error('Error fetching data:', error);
    throw error;
  }
};
// src/components/DataFetcher.vue
<template>
  <div>
    <h1>Data from API</h1>
    <pre>{{ data }}</pre>
  </div>
</template>

<script>
import { fetchData } from '@/services/api';

export default {
  data() {
    return {
      data: null,
    };
  },
  async created() {
    try {
      this.data = await fetchData();
    } catch (error) {
      console.error('Failed to fetch data:', error);
    }
  },
};
</script>

Best Practices to Avoid CORS Issues

  1. Prefer Same-Origin APIs: Whenever possible, host APIs on the same domain or subdomains to avoid cross-origin requests.

  2. Use Environment Variables: Manage API URLs through environment variables to easily switch between development, staging, and production environments.

  3. Handle CORS at the Backend: If you have control over the backend, properly configure CORS headers to allow only necessary origins and methods.

  4. Minimize Proxy Usage: While proxies are helpful, excessive reliance can lead to performance bottlenecks and increased latency.

  5. Monitor Third-Party Dependencies: Regularly check the status and updates of third-party APIs and proxy services you depend on to anticipate and mitigate potential issues.

Related blog posts

Create a free Account to fix CORS Errors in Production

Say goodbye to CORS errors and get back to building great web applications. It's free!

CORSPROXY Dashboard