Auth::id() равен нулю в запросах Laravel api

#php #laravel

#php #laravel

Вопрос:

Я новичок в Laravel, и я только что настроил свою аутентификацию с помощью php artisan make:auth . Я создаю портал обучения, и я пытаюсь создать тему для пользователя, но я не уверен, как правильно получить доступ к идентификатору текущего пользователя. Я рассматривал похожие проблемы, кажется, существует множество способов написания аутентифицированных вызовов, но я не уверен в лучшем методе. Однако в моем примере Auth::id() возвращает null. Кто-нибудь может посоветовать наилучший метод выполнения аутентифицированных вызовов api?

 use IlluminateHttpRequest;
use AppSubject;
use IlluminateSupportFacadesAuth;

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('subjects', function(){
    $subjects = Subject::with(['topics','topics.modules'])->where('user_id', Auth::id())->get();

    return $subjects;
});

Route::post('subjects', function(Request $data){
    if(isset($data->id)){
        $req = Subject::findOrFail($data->id);
        $req->update(['title'=>$data->title, 'subtitle'=>$data->subtitle]);
    }else{
        $new = Subject::create(['user_id'=> Auth::id(), 'title'=>$data->title, 'subtitle'=>$data->subtitle]);
        return $new->id;
    }
});

Route::delete('subjects/{id}', function($id){
    Subject::where('id', $id)->delete();
});
  

Ответ №1:

Вам нужно отправить остальные ваши маршруты через auth:api промежуточное программное обеспечение. Прямо сейчас его использует только ваш /user маршрут.

Вы можете применить промежуточное программное обеспечение к группе маршрутов, подобных этому:

 Route::middleware('auth:api')->group(function () {

    Route::get(...);
    Route::get(...);
    Route::get(...);
});
  

Комментарии:

1. Теперь я получаю 401 при получении с сообщением Unauthorised .

2. Это хорошо. Теперь вам нужно убедиться, что вы указали правильный заголовок авторизации, чтобы ваш пользователь вошел в систему

3. Боюсь, я не понимаю. Не могли бы вы направить меня к какой-нибудь соответствующей документации?

4. @ChrisWickham Я бы начал отсюда: laravel.com/docs/5.8/api-authentication#introduction

Ответ №2:

Попробуйте заменить ->where('user_id', Auth::id()) на ->where('user_id', Auth::user()->id)

Кроме того, вы можете не получить объект, если вы не находитесь внутри промежуточного программного обеспечения auth:

 Route::group(['middleware' => ['auth']], function () { ... }
  

Комментарии:

1. Я получаю "Trying to get property 'id' of non-object" на запрос GET

2. Попробуйте поместить GET route внутри группы маршрутов с авторизацией промежуточного программного обеспечения, как в ответе, или в api auth, в зависимости от ваших потребностей

Ответ №3:

В маршруте subjects вы не заставляете пользователя проходить аутентификацию. Вы должны использовать Auth:: check(), чтобы определить, есть ли аутентифицированный пользователь или нет, а затем получить этого пользователя с помощью Auth::user()