所以我在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);
}
});
答案 0 :(得分:1)
Auth::onceBasic
返回响应(如果失败)或null(如果成功)。从那里创建一个json响应是不可能的。
您需要首先检查身份验证是否成功,如果是,请使用其他方法获取用户。
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);
});
答案 1 :(得分:0)
不确定这是否有帮助。而不是简单地返回Auth :: onceBasic,在那里做一个简单的if-else:
如果(AUTH :: onceBasic) 返回Your-Defined-Json-Response-Success 其他 返回Your-Defined-Json-Response-Success
答案 2 :(得分:0)
我认为你应该能够做到这一点:
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);
来查看它的内容。