Я хочу создать маршрут API, который может вызываться как аутентифицированным пользователем, так и неаутентифицированным пользователем, и возвращать данные в зависимости от того, аутентифицирован ли пользователь.
Я застрял в использовании Auth :: check ().
Функция контроллера выглядит примерно так:
class SomeController extends Controller
{
public function check(Request $request) {
if (Auth::check()) {
return response()->json([
'message' => 'Logged in'
], 200);
}
else {
return response()->json([
'message' => 'Not logged in'
], 200);
}
}
}
У меня есть два сценария:
Сценарий 1
Route::get('scenario1', 'SomeController@check');
В этом сценарии в контроллере, когда я проверяю Auth :: check () внутри условия if, я всегда получаю ложное условие, независимо от того, аутентифицирован пользователь или нет.
Сценарий 2
Route::get('scenario2', 'SomeController@check')->middleware('auth:api');
В этом сценарии в контроллере, когда я проверяю Auth :: check (), я получаю истину, когда пользователь вошел в систему, и ошибку (Маршрут [вход] не определен), когда пользователь не вошел в систему.





Что касается сценария 2, прочтите Защита маршрутов (и следующий подраздел «Перенаправление неаутентифицированных пользователей»).
При подключении промежуточного программного обеспечения auth к маршруту, если пользователь не аутентифицирован, он перенаправляется на маршрут с именем login, который вы не реализовали в своем приложении.
Но я не понял, почему auth работает в вашем сценарии 2, но не работает в вашем сценарии 1…
Чтобы ответить на ваш прямой вопрос
How to use Auth::check() even when not using auth middleware
Вы просто используете Auth::check(). Промежуточное ПО Auth не означает, что у вас всегда есть доступ к классу Auth, это означает, что пользователь должен пройти аутентификацию для посещения / использования определенного маршрута.
Если у вас было промежуточное программное обеспечение auth на маршруте, а затем Auth::check на методе контроллера, который обрабатывал этот маршрут, это всегда было правдой, потому что промежуточное программное обеспечение остановило любого неаутентифицированного пользователя от достижения этой точки.
РЕДАКТИРОВАТЬ. Возможно, вам придется использовать группу промежуточного программного обеспечения для Интернета.
Это не мой опыт: использование Auth::check() возвращало null для аутентифицированного пользователя, когда маршрут не находился за промежуточным программным обеспечением Auth.
Ответ здесь от Феликс Ева:
$user = Auth::guard('api')->user();
Это возвращает null, если пользователь не авторизован.
Я пытаюсь реализовать API, поэтому я не хочу перенаправлять, после вашего ответа я отредактировал Handler.php, чтобы он ответил объектом JSON с сообщением об ошибке «Unauthenticated». Итак, теперь я не получаю сообщение об ошибке «Маршрут [логин] не определен», а получаю сообщение об ошибке «Не прошел проверку подлинности». Это помогло мне получить более качественное сообщение об ошибке для неаутентифицированных пользователей, но проблема Auth :: check () все еще существует. Я хочу разрешить пользователям использовать этот маршрут независимо от того, аутентифицированы они или нет, и по-прежнему использовать фасад Auth.