it-swarm.com.de

Laravel 5.1 API aktivieren Cors

Ich habe nach Möglichkeiten gesucht, cors für laravel 5.1 zu aktivieren. Insbesondere habe ich folgende Bibliotheken gefunden:

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

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

aber keiner von ihnen hat ein Implementierungs-Tutorial speziell für Laravel 5.1, ich habe versucht zu konfigurieren, aber es funktioniert nicht.

Wenn jemand CORS bereits auf laravel 5.1 implementiert hätte, wäre ich dankbar für die Hilfe ...

24
Leonardo Lobato

Hier ist meine CORS Middleware:

<?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;
    }

}

Um die CORS-Middleware zu verwenden, müssen Sie sie zunächst in Ihrer App\Http\Kernel.php-Datei wie folgt registrieren:

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

Dann können Sie es in Ihren Routen verwenden

Route::get('example', array('middleware' => 'cors', 'uses' => '[email protected]'));
54
Alex Kyriakidis

Ich benutze immer eine einfache Methode. Fügen Sie einfach die folgenden Zeilen zur Datei \public\index.php Hinzu. Sie müssen keine Middleware verwenden, denke ich.

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

Ich verwende Laravel 5.4 und leider, obwohl die akzeptierte Antwort in Ordnung zu sein scheint, für Preflight-Anfragen (wie PUT und DELETE), denen ein vorangestellt wird Die Anforderung OPTIONS, die Middleware im Array $routeMiddleware anzugeben (und diese in der Routendefinitionsdatei zu verwenden), funktioniert nur, wenn Sie auch einen Routenhandler für OPTIONS definieren Dies liegt daran, dass ohne OPTIONS route Laravel wird intern antworten auf diese Methode ohne die CORS-Header.

Definieren Sie kurz gesagt entweder die Middleware im Array $middleware, Das global für alle Anforderungen ausgeführt wird, oder definieren Sie, wenn Sie dies in $middlewareGroups Oder $routeMiddleware Tun, auch einen Routenhandler für OPTIONS. Das kann so gemacht werden:

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

Für den gleichen Zweck habe ich auch eine Middleware geschrieben, die ähnlich aussieht, jedoch größer ist, da sie konfigurierbarer sein soll und auch eine Reihe von Bedingungen erfüllt:

<?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;
    }
}

Auch ein Blogpost dazu geschrieben.

7
Rishabh

barryvdh/laravel-cors funktioniert perfekt mit Laravel 5.1 mit nur ein paar wichtigen Punkten, um dies zu ermöglichen.

  1. Stellen Sie nach dem Hinzufügen als composer dependency sicher, dass Sie die CORS-Konfigurationsdatei veröffentlicht und die CORS-Header wie gewünscht angepasst haben. So sieht meine in app/config/cors.php

    <?php
    
    return [
    
        'supportsCredentials' => true,
        'allowedOrigins' => ['*'],
        'allowedHeaders' => ['*'],
        'allowedMethods' => ['GET', 'POST', 'PUT',  'DELETE'],
        'exposedHeaders' => ['DAV', 'content-length', 'Allow'],
        'maxAge' => 86400,
        'hosts' => [],
    ];
    
  2. Danach gibt es einen weiteren Schritt, der in der Dokumentation nicht erwähnt wird. Sie müssen den CORS-Handler 'Barryvdh\Cors\HandleCors' Im App-Kernel hinzufügen. Ich bevorzuge die Verwendung im globalen Middleware-Stack. So was

    /**
     * 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',
    
    ];
    

    Es liegt jedoch an Ihnen, es als Routen-Middleware zu verwenden und auf bestimmten Routen zu platzieren.

Damit sollte das Paket mit L5.1 funktionieren

6
Tariq Khan