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.

27
demandé sur user3856437 2016-09-10 21:50:07

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');
    });
68
répondu Ali Haris 2018-05-16 10:04:36

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.

12
répondu naabster 2016-09-14 11:57:38

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: *');
3
répondu Jaydip Kharvad 2018-07-30 07:58:07

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.

2
répondu Leonardo Jauregui 2017-05-13 14:57:25

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,
];
1
répondu Nick Synev 2018-08-19 17:02:29