2014-11-06 2 views
1

Так у меня перед фильтром на мой запрос REST API, как следующее:Laravel 4,2 возвращает ответ JSON с Auth :: onceBasic()

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 возвращает либо ответ (если он не работает), либо нулевой (если он преуспеет). Создание ответа 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 на неудачу и ничего не добился –

+0

Я отметил это как ответ, потому что он был ближе всего к тому, что я искал. Обновите мой рабочий код. –

+0

Вы всегда должны возвращать ответ, даже если auth не терпит неудачу. См. Мой обновленный ответ. – Marwelln

0

Не уверен, если это помогает. Вместо того, чтобы просто возвращение Auth :: onceBasic, сделать просто, если-то еще есть:

если (Auth :: onceBasic) вернуть Your-Defined-JSon-Response-Успех еще вернуть Ваш Определяемые-Json-Ответ -Success

+1

, если еще не будет работать над этим, потому что Auth :: onceBasic на самом деле вызов заголовка, чтобы заставить базовую аутентификацию .... При проверке логики в случае, иначе он будет видеть его как объект и всегда возвращаются правда. –

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);, чтобы увидеть, что он говорит.

+0

Auth :: onceBasic() возвращает null на успех и отображает «Недействительные учетные данные» при ошибке –

Смежные вопросы