Laravel 4.2返回一个带有Auth::onceBasic()的json响应


Laravel 4.2 returning a json response with Auth::onceBasic()

因此,我在我的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);,看看它说明了什么。