Добавление ответа заголовка 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.
Я знаю, в чем проблема, но я не знаю, куда включить этот заголовок, поскольку это стороннее приложение.
Заранее благодарю специалистов. Пожалуйста, помогите.
Ответы
Ответ 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");