Laravel 7/6 CORS Tutorial and Example

  • Author: Ahmed Bouchefra

In this tutorial, we'll show you how to work with CORS (Cross-Origin Resource Sharing) in Laravel 6/7.

This tutorial shows you how to implement CORS in both Laravel 6 using a third-party package and Laravel 7 which includes a first-party package for CORS support.

Laravel 7 CORS Support

Laravel 7 has been released on March and provides built-in support for CORS so developers don't need to use third party packages to enable CORS in their laravel apps.

According to the official docs:

Laravel 7 includes first-party support for configuring Cross-Origin Resource Sharing (CORS) OPTIONS request responses by integrating the popular Laravel CORS package written by Barry vd. Heuvel. A new cors configuration is included in the default Laravel application skeleton.

For Laravel 6, make sure to continue reading below for a step by step example on how to enable CORS in your REST API backend.

Laravel 7 CORS by Example

Let's now see how CORS is handled in Laravel 7. In fact, you don't need to do much. Open a new command-line interface and start by generating a new Laravel 7 project:

composer create-project --prefer-dist laravel/laravel laravel-7-cors-example

You'll notice that a package called fruitcake/laravel-cors is installed in your project.

Laravel 7 can automatically respond to CORS HTTP OPTIONS requests with values that you can configure.

All CORS settings can be configured in your cors configuration file.

Open the config/cors.php file:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['api/*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => false,

    'max_age' => false,

    'supports_credentials' => false,

];

As you can see you can configure the various aspects of your app such as:

  • The paths that will have CORS configured,
  • The allowed methods.
  • The allowed origins,
  • the allowed heades.
  • The max age,
  • The credentials support.

If you are using custom headers, such as X-Auth-Token, you need to add these headers in the allowed_headers array. You can also use ['*'] to allow all custom headers.

allowed_origins, allowed_headers and allowed_methods can be set to ['*'] to accept any value.

Note: Because of http method overriding in Laravel, If you enable POST methods, users can also send PUT and DELETE requests withour any CORS issues.

The HTTP OPTIONS requests will automatically be handled. Open the App/Http/Middleware/Kernel.php file:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

The HandleCors middleware is added by default in project's gloabl middlewares.

Laravel 6/7 API Example

Let's get started by creating a simple API route in our Laravel project.

Head over to the routes/api.php file and add the following route.

Route::get('/my-api-endpoint',  function  (Request $request)  {

  return response()->json(['Hello Laravel 7']);

});

Now, if we need to call this API endpoint from another domain, CORS issues will appear.

Sending an Http/Ajax Request

Create new HTML file named index.php inside a separate folder and add the following JavaScript/jQuery code to connect to the Laravel API:

<!DOCTYPE html>
<html>
<head>

  <title>Laravel 6/7 CORS Middleware Tutorial</title>

  <script  src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"  crossorigin="anonymous"></script>

</head>

<body>

<script  type="text/javascript">

  $.ajax({
    type:  "GET",
    dataType:  "json",
    url:  'http://localhost:8000/my-api-endpoint',
    success:  function(data){
        console.log(data);
    }
  });

</script>
</body>
</html>

You can simply run this script using the PHP built-in server as follows:

$ php -S localhost:8080

Now we have two apps running from two different ports: localhost:8080 and localhost:8000 which are considered two different domains.

The CORS Error

If the CORS is not configured properly in the target server, which is in our case, Laravel, we'll face CORS issues which disallows the JavaScript/jQuery code from connecting to the API endpoint for security reasons.

This is the exacte error message that you should see in your browser's console:

Access to XMLHttpRequest at 'http://localhost:8000/my-api-endpoint' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

This simply says that a Access-Control-Allow-Origin header should be present in the requested resource.

Solving the CORS Issues in Laravel 6/7

In Laravel. this can be solved using the barryvdh/laravel-cors package which can be installed using Composer.

Installing and Configuring barryvdh/laravel-cors

Head back to your terminal and make sure you are inside your Laravel 6/7 project then install install the barryvdh/laravel-cors package using the following command:

$ composer require barryvdh/laravel-cors

Next, go to the config/app.php file and update it as follows:

'providers'  =>  [

  [...]

  Barryvdh\Cors\ServiceProvider::class,

],

Next, add the \Barryvdh\Cors\HandleCors middleware to the app/Http/Kernel.php file:

protected $middleware =  [

  [...]

 \Barryvdh\Cors\HandleCors::class,

];

That's it, you now run your Laravel 6/7 application and test your code again which should work without any CORS issues.


Sponsored Links

Latest Questions and Answers