2014-11-06 88 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