Laravel 7 Множественная аутентификация с использованием паспорта

#php #laravel #oauth-2.0 #laravel-passport

#php #laravel #oauth-2.0 #laravel-passport

Вопрос:

Я работаю над приложением Laravel, которое требует генерации токена доступа для нескольких пользователей. Я использую Laravel Passport с предоставлением пароля для выдачи токена. Я следил за документацией Laravel, но, похоже, я делаю что-то не так, поскольку меня перенаправили на маршрут входа, когда я пытаюсь вызвать конечную точку моего API (Student) с помощью Postman. Позже я узнал, что перенаправление происходит из созданного мной промежуточного программного обеспечения, но я до сих пор не знаю, что пошло не так

auth.php

         'guards' => [
                'web' => [
                    'driver' => 'session',
                    'provider' => 'users',
                ],
        
                'api' => [
                    'driver' => 'passport',
                    'provider' => 'users',
                    'hash' => false,
                ],
               
                'api-student' => [
                    'driver' => 'passport',
                    'provider' => 'students',
                    'hash' => false,
                ]
    ];
    
    
         'providers' => [
                'users' => [
                    'driver' => 'eloquent',
                    'model' => AppUser::class,
                ],
                'students' => [
                    'driver' => 'eloquent',
                    'model' => AppStudent::class,
                ],
                 
            ],
  

api.php

     Route::post('auth/getlogin', 'ApiStudentController@authenticate')->middleware('auth:api-student');
    
    //ApiStudentController
    public function authenticate(Request $request, Student $user)
        {
            $credentials = [
                'username'=>$request->username,
                'password'=>$request->password];
          
            if(!Auth::guard('api-student')->attempt($credentials)) {
                return response()->json([
                    'message'=>'Error'
                ], 401);
            }
             
            if(Auth::guard('api-student')->attempt($credentials)){
                $user = Auth::guard('client');
                $success['token'] =  $user->createToken('MyApp')->accessToken;
                return response()->json(['success' => $success], $this->successStatus);
            }
            else{
                return response()->json(['error'=>'Username or password incorrect'], 401);
            }
        }
  

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

1. добро пожаловать в SO .. какую ошибку вы получаете.?

2. Я перенаправляюсь на свой маршрут входа вместо того, чтобы получать токен доступа

3. добавьте заголовок "Accept":"application/json" , тогда он не будет перенаправлять

4. Спасибо. Он больше не перенаправляет. Но я получаю {«сообщение»: «Не прошедший проверку подлинности».} после того, как я вызвал конечную точку

5. удалите промежуточное программное обеспечение отсюда auth/getlogin это должен быть общедоступный API, чтобы любой мог войти

Ответ №1:

удалить middleware , чтобы любой мог войти

 Route::post('auth/getlogin', 'ApiStudentController@authenticate')->middleware('auth:api-student');
    
  

Для

 Route::post('auth/getlogin', 'ApiStudentController@authenticate'); 
  

вы применили middleware здесь, поэтому перед выполнением каких-либо действий он проверяет маршрут, если auth или нет

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

1. Спасибо. Но теперь я получил «сообщение»: «Метод Illuminate \ Auth \ RequestGuard::attempt не существует.». Означает ли это, что я неправильно вызвал аутентификацию?

2. Метод attempt является частью, SessionGuard вы не можете использовать Passport просто сгенерировать токен и отправить.