Ajout de la réponse en-tête Access-Control-Allow-Origin dans Laravel 5.3 Passport
Je suis nouveau à Laravel et je fais un projet de passeport Laravel 5.3 avec OAuth2.0 mot de passe grant. Quand je boucle L'API avec les params, elle répond avec token. Cependant, dans le navigateur il a besoin d'une sécurité supplémentaire que le point final devrait ajouter car ma requête vient de localhost alors que l'API est située 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 quel est le problème mais je ne sais pas où mettre pour inclure cet en-tête puisque c'est un tiers App.
Merci d'avance experts. S'il vous plaît aider.
5 réponses
la réponse simple est de mettre le Access-Control-Allow-Origin
en-tête localhost
ou *
. Voici comment je le fais habituellement:
créer un middleware simple appelé Cors
:
php artisan make:middleware Cors
ajouter le code suivant à 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 le *
localhost
ou la garder comme elle est.
Prochaine étape est de charger le middleware. Ajoutez la ligne suivante à l' $routeMiddleware
array app/Http/Kernel.php
.
'cors' => \App\Http\Middleware\Cors::class,
et la dernière étape est pour utiliser les middlewares sur les routes vers lesquelles vous voulez définir les en-têtes access origin. En supposant que vous parliez des nouvelles routes api dans laravel 5.3, l'endroit pour le faire est app/Providers/RouteServiceProvider.php
, dans le mapApiRoutes()
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');
});
Vous pouvez également utiliser le grand laravel-scro paquet par barryvdh.
après avoir installé le paquet, la façon la plus simple d'obtenir le support CORS pour toutes vos routes est d'ajouter le middleware comme ceci dans Http/Kernel.php:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Barryvdh\Cors\HandleCors::class,
];
si vous ne voulez pas avoir le support de CORS sur toutes vos routes vous devriez faire une nouvelle route D'OPTIONS pour /oauth/token
et ajouter l'middleware cors à cette route seulement.
la réponse simple est de définir l'en-tête Access-Control-Allow-Origin à localhost or *. Voici comment je le fais habituellement:
ajouter le code suivant à bootstrap / app.php:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Headers: *');
attention, vous ne pouvez pas modifier le contrôle en amont. De plus, le navigateur (au moins chrome) supprime l'en-tête "authorization"... il en résulte certains problèmes qui peuvent se poser selon la conception de l'itinéraire. Par exemple, un prà © lÃvement n'entrera jamais dans la feuille de route du passeport puisqu'il n'a pas l'en-tête avec le jeton.
dans le cas où vous concevez un fichier avec une implémentation de la méthode options, vous devez définir dans le fichier route web.php un (ou plusieurs) "piège" route de sorte que le preflght (sans autorisation d'en-tête) puisse résoudre la requête et obtenir les en-têtes CORS correspondants. 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.
pour ceux qui n'ont pas résolu le problème en réglant la route middleware dans App\Http\Kernel
, essayez de mettre global middleware. 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');
}
App\Http\Kernel
:
protected $middleware = [
...
\App\Http\Middleware\Cors::class,
];