74 votes

Ajout de la réponse d'en-tête Access-Control-Allow-Origin dans Laravel 5.3 Passport

Je suis nouveau sur Laravel et fais quelques Laravel 5.3 projet de Passeport avec OAuth2.0 le mot de passe de la subvention. Quand j'ai curl, l'API avec les params il répond avec un jeton. Toutefois, dans le navigateur, il a besoin d'une sécurité supplémentaire que le point de terminaison doit ajouter, car ma demande est à venir à partir de localhost alors que l'API est situé dans ma VM. Voici l'erreur:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 400.

Je sais ce qu'est la question, mais je ne sais pas où le mettre d'inclure l'en-tête puisque c'est une application tierce.

Je vous remercie à l'avance les experts. S'il vous plaît aider.

185voto

Haris Points 331

La réponse la plus simple est de définir l' Access-Control-Allow-Origin - tête de localhost ou *. Voici comment j'ai l'habitude de le faire:

Créer un simple appelé middleware Cors:

php artisan make:middleware Cors

Ajoutez le code suivant à l' app/Http/Middleware/Cors.php:

public function handle($request, Closure $next)
{
    return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
}

Vous pouvez remplacer l' * avec localhost ou la garder comme elle est.

La prochaine étape est de charger le middleware. Ajoutez la ligne suivante à l' $routeMiddleware tableau en app/Http/Kernel.php.

'cors' => \App\Http\Middleware\Cors::class, 

Et la dernière étape consiste à utiliser le middleware sur les routes pour lequel vous souhaitez définir les accès l'origine des en-têtes. En supposant que vous parler de la nouvelle api de routes dans laravel 5.3, l'endroit pour le faire, c'est - app/Providers/RouteServiceProvider.php, à l'intérieur de l' mapApiRoutes() de la fonction (vous pouvez supprimer ou commenter le code de la fonction):

    Route::group([
        'middleware' => ['api', 'cors'],
        'namespace' => $this->namespace,
        'prefix' => 'api',
    ], function ($router) {
         //Add you routes here, for example:
         Route::apiResource('/posts','PostController');
    });

63voto

Jaydip Kharvad Points 71

La réponse simple consiste à définir l'en-tête Access-Control-Allow-Origin sur localhost ou *. Voici comment je le fais habituellement:

Ajoutez le code suivant à bootstrap / app.php:

 header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
 

22voto

naabster Points 91

Vous pouvez également utiliser le paquet great laravel-cors de barryvdh .

Une fois le paquet installé, le moyen le plus simple d’obtenir la prise en charge de CORS pour toutes vos routes est d’ajouter le middleware comme celui-ci dans Http / Kernel.php:

 protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Barryvdh\Cors\HandleCors::class,
];
 

Si vous ne souhaitez pas que CORS soit pris en charge sur toutes vos routes, vous devez créer une nouvelle route OPTIONS pour /oauth/token et ajouter le middleware cors à cette route uniquement.

8voto

Nick Synev Points 90

Pour ceux qui n'ont pas résolu le problème du middleware d'itinéraires définissant les problèmes dans App\Http\Kernel , essayez de définir un middleware global. En App\Http\Middleware\Cors :

 public function handle($request, Closure $next)
{
    return $next($request)->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods','GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS')
        ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}
 

En App\Http\Kernel :

 protected $middleware = [
    ...
    \App\Http\Middleware\Cors::class,
];
 

3voto

Attention, vous ne pouvez pas modifier le contrôle en amont. En outre, le navigateur (à moins de chrome) supprime le "autorisation" de l'en-tête ... il en résulte des problèmes qui peuvent survenir en fonction de la conception du tracé. Par exemple, un contrôle en amont n'entreront jamais dans le passeport de la feuille de route puisqu'il n'a pas l'en-tête avec le jeton.

Dans le cas où vous créez un fichier avec une mise en œuvre de la méthode des options, vous devez définir dans le fichier de route web.php un (ou plusieurs) "piège" de l'itinéraire, de sorte que le preflght (sans en-tête d'autorisation) peut résoudre le demander et d'Obtenir le correspondant de la SCRO en-têtes. Parce qu'ils ne peuvent pas retourner dans un middleware 200 par défaut, ils doivent ajouter les en-têtes de la requête originale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X