Подтвердить что ты не робот

Добавление ответа заголовка Access-Control-Allow-Origin в паспорте Laravel 5.3

Я новичок в Laravel и делаю несколько проектов Passport 5.3 с паспортом OAuth2.0. Когда я скручиваю API с параметрами, он отвечает токеном. Однако в браузере требуется дополнительная безопасность, которую должна добавить конечная точка, потому что мой запрос поступает с локального хоста, а API находится в моей виртуальной машине. Здесь ошибка:

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.

Я знаю, в чем проблема, но я не знаю, куда включить этот заголовок, поскольку это стороннее приложение.

Заранее благодарю специалистов. Пожалуйста, помогите.

4b9b3361

Ответ 1

Простой ответ - установить Access-Control-Allow-Origin заголовка Access-Control-Allow-Origin значение localhost или *. Вот как я обычно это делаю:

Создайте простое промежуточное ПО под названием Cors:

php artisan make:middleware Cors

Добавьте следующий код в 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');
}

Вы можете заменить * на localhost или оставить его как есть.

Следующим шагом является загрузка промежуточного программного обеспечения. Добавьте следующую строку в массив $routeMiddleware в app/Http/Kernel.php.

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

И последний шаг - использование промежуточного программного обеспечения на маршрутах, для которых вы хотите установить заголовки источника доступа. Предполагая, что вы говорите о новых маршрутах API в laravel 5.3, вам нужно сделать это app/Providers/RouteServiceProvider.php, внутри функции mapApiRoutes() (вы можете удалить или прокомментировать предыдущий код функции):

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

Ответ 2

Простой ответ - установить для заголовка Access-Control-Allow-Origin значение localhost или *. Вот как я обычно это делаю:

Добавьте следующий код в bootstrap/app.php:

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

Ответ 3

Вы также можете использовать большой пакет laravel-cors от barryvdh.

После установки пакета самый простой способ получить поддержку CORS для всех ваших маршрутов - это добавить промежуточное программное обеспечение, подобное этому в Http/Kernel.php:

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

Если вы не хотите иметь поддержку CORS на всех ваших маршрутах, вы должны сделать новый маршрут OPTIONS для /oauth/token и добавить промежуточное ПО cors только на этот маршрут.

Ответ 4

Для тех, кто не решил проблему установки промежуточного программного обеспечения маршрута в App\Http\Kernel, попробуйте установить глобальное промежуточное программное обеспечение. В 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,
];

Ответ 5

Будьте осторожны, вы не можете изменить предполетный период. Кроме того, браузер (по крайней мере, хром) удаляет заголовок "authorization"... это приводит к некоторым проблемам, которые могут возникнуть в соответствии с дизайном маршрута. Например, предполетный срок никогда не войдет в лист маршрута паспорта, так как он не имеет заголовка с токеном.

В случае, если вы создаете файл с реализацией метода options, вы должны определить в файле маршрута web.php один (или несколько) маршрут "ловушки", чтобы префикс (без разрешения заголовка) мог разрешить запрос и Получить соответствующие заголовки CORS. Поскольку они не могут вернуться в промежуточное ПО 200 по умолчанию, они должны добавить заголовки в исходный запрос.

Ответ 6

Просто добавьте это к вашему мнению:

<?php header("Access-Control-Allow-Origin: *"); ?>

Ответ 7

Создайте файл Cors.php в App/Http/Middleware и вставьте его в него. ☑

<?php

namespace App\Http\Middleware;

use Closure;


class Cors {    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, Authorization',
        ];
        if ($request->getMethod() == "OPTIONS"){
            //The client-side application can set only headers allowed in Access-Control-Allow-Headers
            return response()->json('OK',200,$headers);
        }
        $response = $next($request);
        foreach ($headers as $key => $value) {
            $response->header($key, $value);
        }
        return $response;

    } }

И добавьте эту строку в свой Kernel.php после строки "Trust Proxies :: Class".

\App\Http\Middleware\Cors::class,

Вот и все, что вы допустили. ☑

Ответ 8

Просто добавьте это в свой контроллер кода

return response()->json(compact('token'))->header("Access-Control-Allow-Origin",  "*");

Ответ 9

Я использую Laravel 6, и хотя в конечном итоге мне помог ответ с самым высоким рейтингом, мне пришлось внести небольшую корректировку.

Функция mapApiRoutes() в app/Providers/RouteServiceProvider.php теперь выглядит следующим образом -

protected function mapApiRoutes()
{
    Route::prefix('api')
        ->middleware('api')
        ->namespace($this->namespace)
        ->group(base_path('routes/api.php'));
}

Поэтому я просто добавил cors в массив api в $middlewareGroups в app/Http/Kernel.php, и это решило все мои проблемы.

protected $middlewareGroups = [
    ...
    'api' => [
        'throttle:60,1',
        'bindings',
        'cors',
    ],
];

Ответ 10

Если вы применили промежуточное программное обеспечение CORS, но оно все еще не работает, попробуйте это.

Если маршрут для вашего API:

Route::post("foo", "MyController"})->middleware("cors");

Затем вам нужно изменить его, чтобы учесть метод OPTIONS:

Route::match(['post', 'options'], "foo", "MyController")->middleware("cors");