因此,我在我的REST API请求上有一个前过滤器,如下所示:
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);
}
});
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);
});
不确定这是否有帮助。与其简单地返回Auth::onceBasic,不如做一个简单的if-elsethere:
if(Auth::onceBasic)return您定义的Json响应成功其他的return您定义的Json响应成功
我认为你应该能够做到这一点:
Route::filter('auth.api', function() {
Config::set('session.driver', 'array');
$result = json_encode(Auth::onceBasic('username'));
return $result;
});
只要Auth::onceBasic('usersname');
返回一个对象或数组,即'key' => 'value'
是否应该由json_encode
编码。试试看会发生什么。另外,尝试var_dumping或dding dd($result);
,看看它说明了什么。