2014-11-06 45 views
1

所以我濾波器之前有一個對我像REST API請求如下:Laravel 4.2返回與驗證:: onceBasic()的JSON響應

Route::filter('auth.api', function() { 
    Config::set('session.driver', 'array'); 
    return Auth::onceBasic('username'); 
}); 

這完美的作品對我來說,只是我寧願它的回報一個JSON響應。所以我嘗試圍繞它在Request::json()和失敗慘敗。然後我認爲我可以創建一個AFTER過濾器,以json的形式返回響應。但是,我無法確定在這一點上驗證是否成功。

Route::filter('auth.api.after', function($request, $response) { 
    die(var_dump($response)); 
}); 

我想在失敗時迴應json。我怎樣才能做到這一點?

工作代碼:

Route::filter('auth.api', function() { 
    Config::set('session.driver', 'array'); 
    $response = Auth::onceBasic('username'); 

    if (!is_null($response)) { 
     $failMessage = [ 
      'status' => 'error', 
      'message' => 'Invalid Credentials' 
     ]; 

     $headers = ['WWW-Authenticate' => 'Basic']; 
     return Response::json($failMessage, 401, $headers); 
    } 
}); 

回答

1

Auth::onceBasic返回響應(如果失敗)或null(如果成功)。創建一個JSON響應是不可能的。

您需要先檢查auth是否成功,如果是,請用另一種方法獲取用戶。

Route::filter('auth.api', function() { 
    Config::set('session.driver', 'array'); 

    // Return the response onceBasic gives us if auth fails, otherwise get the current logged in user and turn it into a json response. 
    return Auth::onceBasic('username') ?: Response::json(Auth::user()->toArray()); 
}); 

如果你總是希望返回一個JSON響應,只需檢查onceBasic回報null

Route::filter('auth.api', function() { 
    Config::set('session.driver', 'array'); 

    // If onceBasic doesn't return null, it means auth failed. 
    if (null !== Auth::onceBasic('username')) { 
     $message = ['status' => 'error', 'message' => 'Invalid credentials']; 
     $headers = ['WWW-Authenticate' => 'Basic']; 

     return Response::json($message, 401, $headers); 
    } 

    return Response::json(['status' => 'success', 'message' => 'Auth succeeded'], 200); 
}); 
+0

這是靠近但沒有雪茄。我意識到它是這樣做的。不過,我只想在失敗時返回一個JSON響應。這將成功返回一串「無效憑證」或用戶的JSON表示。我想要一個失敗的json響應,並且沒有任何成功 – 2014-11-06 15:02:45

+0

我將此標記爲答案,因爲它與我所尋找的最接近。請更新我的工作代碼。 – 2014-11-06 15:16:20

+0

即使auth沒有失敗,您也應該始終返回響應。看到我更新的答案。 – Marwelln 2014-11-06 17:14:24

0

不知道這是否有助於。而不是簡單地返回驗證:: onceBasic,做一個簡單的if-else有:

如果(AUTH :: onceBasic) 返回你的定義,JSON-響應成功 其他 回到你的定義,JSON-響應-Success

+1

如果別人也不會在這方面努力,因爲驗證:: onceBasic實際上做了標題號召迫使基本驗證....而在if-else的檢查邏輯,會看到它作爲一個對象,總是返回真正。 – 2014-11-06 15:04:55

0

我想你應該能夠做到這一點:

Route::filter('auth.api', function() { 
    Config::set('session.driver', 'array'); 
    $result = json_encode(Auth::onceBasic('username')); 
    return $result; 
}); 

只要Auth::onceBasic('usersname');返回是否應該編碼,能夠通過json_encode一個對象或數組即'key' => 'value'。試試看看會發生什麼。另外,請嘗試var_dumping或dding dd($result);以查看它說的內容。

+0

Auth :: onceBasic()在成功時返回null,並在失敗時顯示「無效憑證」 – 2014-11-06 15:03:55