2016-09-10 13 views
18

Laravel'e yeni geldim ve OAuth2.0 şifre hibe ile Laravel 5.3 Passport projesi yapıyorum. API'yi params ile kıstırdığımda jetonla yanıt verir. Ancak, tarayıcıda, API sanal makinemde yer alırken isteğimin localhost'tan gelmesi nedeniyle, bitiş noktasının eklenmesi gereken ek bir güvenlik gerekir.Laravel'de Erişim-Denetim-İzin-Menşe başlık yanıtı ekleme 5.3 Pasaporta

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. 

Sorunun ne olduğunu biliyorum ama bu bir üçüncü taraf uygulama olduğundan bu başlığı dahil koymak nerede bilmiyorum: İşte hatadır.

Önceden teşekkür uzmanları. Lütfen yardım et.

cevap

51

Basit bir yanıt, erişim kaynağı üstbilgisini localhost veya * olarak ayarlamaktır. Burada

Ve bulunuyor Genellikle bunu nasıl:

CORS denilen basit bir ara katman oluşturun: app/Http/Katman/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'); 
} 
için

php artisan make:middleware Cors 

aşağıdaki kodu ekleyin

(*) öğesini localhost ile değiştirebilir veya olduğu gibi koruyabilirsiniz.

Sonraki adım, katmanı yüklemek içindir. Aşağıdaki satırı app/Http/Kernel.php'ye ekleyin. Satırı $ routedMiddleware dizisine ekleyin.

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

Ve son adım, erişim kökenli başlıklarını ayarlamak istediğiniz yolları üzerinde ara katman kullanmaktır. Laravel 5.3 yeni api yolları hakkında konuşuyor varsayarak, bunu yapmak için app app/Sağlayıcılar/RouteServiceProvider.php, mapApiRoutes() işlevidir.

Route::group([ 
     'middleware' => ['api', 'cors'], 
     'namespace' => $this->namespace, 
     'prefix' => 'api', 
    ], function ($router) { 
+0

Ben de bu işi yapmaya çalışıyorum ([bakınız] (https: // stackoverflow.com/questions/46991025/access-control-allow-origin-header-response-in-laravel-5-4-not-working-for-post)) ancak bazı nedenlerden dolayı sadece GET istekleri çalışır. POST'un neden kurulumumla çalışmadığı hakkında bir fikrin var mı? Ayrıca ... ara yazılımın sırası önemli gibi görünüyor. – displayname

+0

Ajax çağrısı yapıyorum ve bu çözüm benim için hiç bir öneride bulunmuyor mu? –

+0

Güzel, Benim için çalışıyor. Teşekkürler –

11

Ayrıca mükemmel laravel-cors package by barryvdh kullanabilirsiniz. Eğer CORS'yi olmasını istemiyorsanız

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

: Eğer paket yükledikten sonra

, tüm yollar için CORS destek almanın en kolay yolu Http/Kernel.php böyle ortakatmanını eklemektir Tüm rotalarınızı destekleyin, /oauth/token için yeni bir SEÇENEKLER rotası oluşturmalısınız ve cors middleware'i sadece o rotaya ekleyin.

1

Dikkatli olun, ön fareyi değiştiremezsiniz. Ayrıca, tarayıcı (en azından krom) "yetkilendirme" başlığını kaldırır ... bu, rota tasarımına göre ortaya çıkabilecek bazı sorunlara yol açar. Örneğin, bir ön kontrol pasaport güzergahı sayfasına asla üstbilgiye sahip olmadığı için pasaport güzergahı sayfasına girmeyecektir.

Seçenek yönteminin uygulanacağı bir dosya tasarlıyorsanız, web_php (ya da birden fazla) "trap" yol dosyasında, ön başlık (başlık yetkilendirmesi olmadan) rota dosyasını tanımlamanız gerekir. isteği çözümleyin ve ilgili CORS başlıklarını edinin. Varsayılan olarak bir katman yazılımında (200) dönüş yapamayacakları için, üstbilgileri orijinal istek üzerine eklemelidirler.