2015-07-13 93 views
1

我正在使用Laravel框架創建REST API。一切都很好 !但是我有自定義身份驗證和授權的問題。
默認情況下,Laravel在內核中有一些基本的身份驗證,這對桌面/瀏覽器應用程序來說是一個很好的安全層,但是對於主要在移動設備上使用的REST API,它是多餘的。
所以我有評論在Kernel.php如何在Laravel中爲REST API創建身份驗證

/* \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \App\Http\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
     \App\Http\Middleware\VerifyCsrfToken::class,*/ 

這些線路相反,我創造了自己的中間件類,並將其綁定路由

protected $routeMiddleware = [ 
     'auth' => \App\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'auth.token' => \App\Http\Middleware\TokenAuthMiddleware::class, 
     'auth.simple' => \App\Http\Middleware\AuthBasicMiddleware::class, 
    ]; 

我決定用常用的方法 - 令牌(不OAuth的服務器) 。令牌是爲了響應用戶憑證而發佈的,而不是在需要時刷新。
我中間件類只是骨架

<?php 

namespace App\Http\Middleware; 

use Closure; 

class TokenAuthMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     dd($request->header()); 
     return $next($request); 
    } 
} 

我刨消耗從Authorization頭的道理,在請求和檢查它,如果它是有效的,沒有過期允許用戶訪問受保護的內容。
我想在我的中間件類中做到這一點。但我有一個問題,我沒有收到請求頭。爲了測試API,我使用了Chrome Extension(Advance Rest Client)或Curl,但它們都不起作用,我的意思是客戶端運行良好,但問題在於laravel。

問題是,我已經手動在我的請求中標識了標題,但是沒有一個出現在laravel dd - dd($request->header());中。

我嘗試了不同的標題,他們的工作,不是全部,但其中一些除了Authorization標題。

下面是一個例子

Request headers 
CSP: active 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36 
From: asdasdsadsa 
Authorization: token=20sadsa 
Accept: */* 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2 
Cookie: PHPSESSID=sdotvgu9bvm63b947h5d98nk72; language=ru; currency=UAH 

而我從DD

array:9 [ 
    "host" => array:1 [ 
    0 => "myhost ip" 
    ] 
    "connection" => array:1 [ 
    0 => "keep-alive" 
    ] 
    "csp" => array:1 [ 
    0 => "active" 
    ] 
    "user-agent" => array:1 [ 
    0 => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36" 
    ] 
    "from" => array:1 [ 
    0 => "asdasdsadsa" 
    ] 
    "accept" => array:1 [ 
    0 => "*/*" 
    ] 
    "accept-encoding" => array:1 [ 
    0 => "gzip, deflate, sdch" 
    ] 
    "accept-language" => array:1 [ 
    0 => "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2" 
    ] 
    "cookie" => array:1 [ 
    0 => "PHPSESSID=myphpsession; language=ru; currency=UAH" 
    ] 
] 

得到正如你可以看到From頭作品,但授權頭中不存在傾銷。
對我來說,似乎laravel正在消耗和刪除我的中間件之前的授權標題,即使我已經爲任何請求評論了默認中間件。

請幫忙解決這個問題。或者,還有另一種更好的方法來在REST API中進行身份驗證?我會很感激任何建議,批評。
謝謝。

回答

1

問題不在於Laravel,而是在Apache Web Server配置文件中。
將此行添加到.htaccess文件到public目錄中。

RewriteRule^- [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

解決了這個問題。

P.S.

如果還有其他更好的方法來處理REST API Authorization + Laravel,請發表評論。

0

我正在尋找相同的答案,我發現這個鏈接對於使用JWT LINK的L5的詳細信息和用法非常有用。

和第二種解決方案是: JSON WEB TOKEN

跳它可以幫助你。