web-dev-qa-db-fra.com

Laravel 5.1 API Enable Cors

J'ai cherché des moyens d'activer cors sur laravel 5.1 en particulier, j'ai trouvé des bibliothèques telles que:

https://github.com/neomerx/cors-illuminate

https://github.com/barryvdh/laravel-cors

mais aucun d’entre eux n’a de didacticiel spécifique à Laravel 5.1, j’ai essayé de configurer mais cela ne fonctionne pas.

Si quelqu'un implémentait déjà CORS sur laravel 5.1, je vous serais reconnaissant de l'aide ...

24
Leonardo Lobato

Voici mon middleware CORS:

<?php namespace App\Http\Middleware;

use Closure;

class CORS {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        header("Access-Control-Allow-Origin: *");

        // ALLOW OPTIONS METHOD
        $headers = [
            'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
        ];
        if($request->getMethod() == "OPTIONS") {
            // The client-side application can set only headers allowed in Access-Control-Allow-Headers
            return Response::make('OK', 200, $headers);
        }

        $response = $next($request);
        foreach($headers as $key => $value)
            $response->header($key, $value);
        return $response;
    }

}

Pour utiliser le middleware CORS, vous devez d'abord l'enregistrer dans votre fichier app\Http\Kernel.php de la manière suivante:

protected $routeMiddleware = [
        //other middlewares
        'cors' => 'App\Http\Middleware\CORS',
    ];

Ensuite, vous pouvez l'utiliser dans vos itinéraires

Route::get('example', array('middleware' => 'cors', 'uses' => 'ExampleController@dummy'));
54
Alex Kyriakidis

J'utilise toujours une méthode facile. Ajoutez simplement les lignes ci-dessous à \public\index.php fichier. Vous n'êtes pas obligé d'utiliser un middleware, je pense.

header('Access-Control-Allow-Origin: *');  
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
25
Joel James

J'utilise Laravel 5.4 et malheureusement, bien que la réponse acceptée semble correcte, pour les demandes de contrôle en amont (comme PUT et DELETE), elles seront précédées d'un OPTIONS request, spécifiant le middleware dans le $routeMiddleware array (et son utilisation dans le fichier de définition des routes) ne fonctionnera que si vous définissez également un gestionnaire de route pour OPTIONS. En effet, sans OPTIONS route Laravel va répondre en interne à cette méthode sans les en-têtes CORS.

Bref, définissez le middleware dans le $middleware tableau qui fonctionne globalement pour toutes les demandes ou si vous le faites dans $middlewareGroups ou $routeMiddleware définit alors également un gestionnaire d’itinéraires pour OPTIONS. Cela peut être fait comme ça:

Route::match(['options', 'put'], '/route', function () {
    // This will work with the middleware shown in the accepted answer
})->middleware('cors');

Dans le même but, j’ai également écrit un middleware similaire, mais de taille plus grande, car il essaie d’être plus configurable et gère un ensemble de conditions:

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    private static $allowedOriginsWhitelist = [
      'http://localhost:8000'
    ];

    // All the headers must be a string

    private static $allowedOrigin = '*';

    private static $allowedMethods = 'OPTIONS, GET, POST, PUT, PATCH, DELETE';

    private static $allowCredentials = 'true';

    private static $allowedHeaders = '';

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
      if (! $this->isCorsRequest($request))
      {
        return $next($request);
      }

      static::$allowedOrigin = $this->resolveAllowedOrigin($request);

      static::$allowedHeaders = $this->resolveAllowedHeaders($request);

      $headers = [
        'Access-Control-Allow-Origin'       => static::$allowedOrigin,
        'Access-Control-Allow-Methods'      => static::$allowedMethods,
        'Access-Control-Allow-Headers'      => static::$allowedHeaders,
        'Access-Control-Allow-Credentials'  => static::$allowCredentials,
      ];

      // For preflighted requests
      if ($request->getMethod() === 'OPTIONS')
      {
        return response('', 200)->withHeaders($headers);
      }

      $response = $next($request)->withHeaders($headers);

      return $response;
    }

    /**
     * Incoming request is a CORS request if the Origin
     * header is set and Origin !== Host
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function isCorsRequest($request)
    {
      $requestHasOrigin = $request->headers->has('Origin');

      if ($requestHasOrigin)
      {
        $Origin = $request->headers->get('Origin');

        $Host = $request->getSchemeAndHttpHost();

        if ($Origin !== $Host)
        {
          return true;
        }
      }

      return false;
    }

    /**
     * Dynamic resolution of allowed Origin since we can't
     * pass multiple domains to the header. The appropriate
     * domain is set in the Access-Control-Allow-Origin header
     * only if it is present in the whitelist.
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function resolveAllowedOrigin($request)
    {
      $allowedOrigin = static::$allowedOrigin;

      // If Origin is in our $allowedOriginsWhitelist
      // then we send that in Access-Control-Allow-Origin

      $Origin = $request->headers->get('Origin');

      if (in_array($Origin, static::$allowedOriginsWhitelist))
      {
        $allowedOrigin = $Origin;
      }

      return $allowedOrigin;
    }

    /**
     * Take the incoming client request headers
     * and return. Will be used to pass in Access-Control-Allow-Headers
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function resolveAllowedHeaders($request)
    {
      $allowedHeaders = $request->headers->get('Access-Control-Request-Headers');

      return $allowedHeaders;
    }
}

Également écrit un blog post à ce sujet.

7
Rishabh

barryvdh/laravel-cors fonctionne parfaitement avec Laravel 5.1 avec juste quelques points clés pour l'activer.

  1. Après l’avoir ajouté en tant que dépendance composer), assurez-vous que vous avez publié le fichier de configuration CORS et ajusté les en-têtes CORS comme vous le souhaitez. Voici à quoi ressemble le mien app/config/cors.php

    <?php
    
    return [
    
        'supportsCredentials' => true,
        'allowedOrigins' => ['*'],
        'allowedHeaders' => ['*'],
        'allowedMethods' => ['GET', 'POST', 'PUT',  'DELETE'],
        'exposedHeaders' => ['DAV', 'content-length', 'Allow'],
        'maxAge' => 86400,
        'hosts' => [],
    ];
    
  2. Après cela, il reste une étape non mentionnée dans la documentation, vous devez ajouter le gestionnaire CORS 'Barryvdh\Cors\HandleCors' dans le noyau de l'application. Je préfère l'utiliser dans la pile de middleware globale. Comme ça

    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
        'Illuminate\Cookie\Middleware\EncryptCookies',
        'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
        'Illuminate\Session\Middleware\StartSession',
        'Illuminate\View\Middleware\ShareErrorsFromSession',
    
        'Barryvdh\Cors\HandleCors',
    
    ];
    

    Mais c'est à vous de l'utiliser comme middleware d'itinéraires et de le placer sur des itinéraires spécifiques.

Cela devrait faire fonctionner le paquet avec L5.1

6
Tariq Khan