在 Laravel 5.3 护照中添加 Access-Control-Allow-Origin header 回复

Adding Access-Control-Allow-Origin header response in Laravel 5.3 Passport

我是 Laravel 的新手,正在做一些 Laravel 5.3 Passport 项目,其中包含 OAuth2.0 密码授权。当我用参数卷曲 API 时,它会用令牌响应。但是,在浏览器中,它需要端点应添加的额外安全性,因为我的请求来自本地主机,而 API 位于我的 VM 中。这是错误:

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.

我知道问题出在哪里,但我不知道该把它放在哪里 header 因为这是第三方应用程序。

先谢谢各位专家了。请帮忙。

简单的答案是将 Access-Control-Allow-Origin header 设置为 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 或保持原样。

下一步是加载中间件。将以下行添加到 app/Http/Kernel.php 中的 $routeMiddleware 数组。

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

最后一步是在要设置访问源 header 的路由上使用中间件。假设你正在谈论 laravel 5.3 中的新 api 路由,那么在 app/Providers/RouteServiceProvider.phpmapApiRoutes() 函数中(你可以删除或注释之前的代码函数):

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

您也可以使用很棒的 laravel-cors package by barryvdh

安装包后,为所有路由获取 CORS 支持的最简单方法是在 Http/Kernel.php:

中添加这样的中间件
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Barryvdh\Cors\HandleCors::class,
];

如果您不想在所有路由上都支持 CORS,您应该为 /oauth/token 创建一个新的 OPTIONS 路由,并仅将 cors 中间件添加到该路由。

编辑 Laravel 8

Laravel 8 已经内置了 CORS 支持 - HandleCors 中间件在全局 middleware stack by default 中定义并且可以在应用程序的 config/cors.php 配置文件中进行配置。

如果您更新 Laravel 应用程序,请务必使用提供的中间件更改 barryvdh 的包:\Fruitcake\Cors\HandleCors::class

请注意,您无法修改预检。 另外,浏览器(至少chrome)去掉了"authorization" header ...这导致根据路由设计可能出现的一些问题。例如,预检将永远不会进入护照路线 sheet,因为它没有带有令牌的 header。

如果您正在设计一个实现了选项方法的文件,您必须在路由文件中定义web.php一个(或多个)"trap"路由,以便preflght (无需header授权)即可解析请求并获取对应的CORS header。 因为默认情况下他们不能在中间件 200 中 return,所以他们必须在原始请求中添加 header。

简单的答案是将 Access-Control-Allow-Origin header 设置为 localhost 或 *。以下是我通常的做法:

将以下代码添加到bootstrap/app。php:

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

警告:仅在您的开发环境中执行此操作。

没有解决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,
];

只需将此添加到您的视图中:

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

在 App/Http/Middleware 中创建一个 Cors.php 文件并将其粘贴到其中。 ☑

<?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;

    } }

并在 "Trust Proxies::Class" 行之后的 Kernel.php 中添加此行。

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

就是这样,你已经允许了所有 Cors Header。 ☑

只需将此添加到您的代码控制器

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

如果您已应用 CORS 中间件但它仍然无法正常工作,请尝试此操作。

如果您 API 的路线是:

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

然后您需要更改它以允许使用 OPTIONS 方法:

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

之后 https://github.com/fruitcake/laravel-cors 我必须更改 cors.php 文件如下

     * Sets the Access-Control-Allow-Credentials header.
     */
    'supports_credentials' => true,

只需几个步骤即可将 Access-Control-Allow-Origin header 添加到 localhost or *.

第 1 步:创建 Cors 中间件:

php artisan make:middleware Cors

第 2 步:像这样在 Cors 中间件中设置 header

public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->headers->set('Access-Control-Allow-Origin' , '*');
        $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
        $response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');

        return $response;
    }

第 3 步:我们需要在 app/Http/Kernel.php

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

这里不需要检查任何中间件 因为我们在 app/Http/Kernel.php

中的 $middleware 中添加了 Cors class

工作解决方案

第 1 步:创建 Cors 中间件

php artisan make:middleware Cors

第 2 步:在句柄函数内的 Cors 中间件中设置 header

return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

第 3 步:在 app/Http/Kernel 中添加 Cors class。php

protected $routeMiddleware = [
    ....
    'cors' => \App\Http\Middleware\Cors::class,
];

第 4 步:替换 app/providers/routeServiceProvider.php

中的 mapApiRoutes
Route::prefix('api')
         ->middleware(['api', 'cors'])
         ->namespace($this->namespace)
         ->group(base_path('routes/api.php'));

第 5 步:在 routes/api.php

中添加您的路线
Route::post('example', 'controllerName@functionName')->name('example');

如果由于某种原因它仍然无法正常工作。 Laravel 的第一个选项 任何应用程序的第二个选项

第一个选项:

  1. 如上例,我们创建中间件

     php artisan make:middleware Cors
    
  2. 将以下代码添加到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, PATCH, DELETE, OPTIONS')
             ->header('Access-Control-Allow-Headers', 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'); 
     }
    

仔细看,表头的数据量->header('Access-Control-Allow-Headers',

  1. 第三步,在[​​=18=]

    中的$routeMiddleware数组中添加中间件
     protected $routeMiddleware = [
         ....
         'cors' => \App\Http\Middleware\Cors::class,
     ];
    

第二个选项:

  1. 打开您域的 nginx.conf 设置。

     sudo nano /etc/nginx/sites-enabled/your-domain.conf
    
  2. 在服务器设置里面服务器{ listen 80; .... }请添加以下代码:

     add_header 'Access-Control-Allow-Origin' '*';
     add_header 'Access-Control-Allow-Credentials' 'true';
     add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
     add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
    

我正在使用 Laravel 8 并且刚刚安装了 fruitcake/laravel-cors 并在 app/Http/Kernel.php 中使用它,就像打击一样:

protected $middleware = [
      ....
         \Fruitcake\Cors\HandleCors::class,
    ];

注意: 像我一样把它添加到数组的末尾

在 bootstrap/app 中添加 headers 即可轻松完成。php

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

您不需要做任何额外的事情。 Laravel 已经有内置的规定 - 从这里阅读