Как я могу исправить ошибку InvalidArgumentException: Auth guard [клиентов] не определено. в JWT - PullRequest
0 голосов
/ 27 февраля 2020

У меня ошибка при входе в api от jwt .. когда я регистрирую его добрую волю, но при входе в систему отображается ошибка

InvalidArgumentException: Auth guard [клиентов] не определено. в файле C: \ Users \ Ahmed \ Desktop \ project web \ laravel_pro \ vendor \ laravel \ framework \ src \ Illuminate \ Auth \ AuthManager. php в строке 84

это контроллер

public function login(Request $request){
    $credentials = $request->only('email', 'password');

    if (Auth::guard('customer')->attempt($credentials))
    {
       $user= JWTAuth::guard('customer')->user(); 
       $jwt = JwtAuth::generateToken($user);

       return response()->json(compact('jwt'));

    }else{

        return response()->json(['error' => 'invalid_credentials'], 400);
    }

это маршрут API

Route::post('login','UserController@login');

это аутентификация php

 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],

        'customer'=>[
          'driver' => 'token',
          'provider'=> 'customers',
        ]

    ],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'customers' => [
            'driver' => 'eloquent',
            'model' => App\Customer::class,
        ],

Пожалуйста, помогите мне с решением ... Спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Первое предположение : в config/auth.php драйвер для желаемой охраны должен быть 'jwt' вместо 'token', потому что драйвер 'token' работает с фиксированным ха sh в таблице пользователей, в отличие от jwt, который является изменчивым и не запрашивает БД, чтобы выяснить пользователя.

Второе предположение : вы используете один и тот же контроллер для «внутренних пользователей» (защита «api») и «пользователей пользователей» (следует использовать защиту «клиент»). Это смущает. Где вы различаете тип пользователя?

Относительно ошибки

Авторизация [клиенты] не определена.

Убедитесь, что это не опечатка, и вы всегда обращайтесь к нему как к «покупателю», так как «покупатель с » - не охранник, а поставщик. Например, проверьте, является ли промежуточное ПО маршрута (например, Route::['middleware'=>'auth:customer']


Сказав это ...

Я полагаю, вы установили tymondesigns / jwt -auth , руководство по конфигурации которого указывает на сценарий, в котором вы заменяете защиту api для использования, поэтому при этом допущении убедитесь, что вы внесли следующие изменения:

  1. При использовании Laravel 5.4 или ниже вам необходимо выполнить следующие шаги . В более новой версии они обрабатываются для вас, поэтому вы можете пропустить этот шаг

  2. Как я уже говорил выше, в config/auth.php драйвер для желаемой защиты должен быть 'jwt' вместо 'token', потому что драйвер 'token' работает с фиксированным ha sh в таблице пользователей, в отличие от jwt, который является изменчивым и не запрашивает БД для определения пользователя.

  3. Вам необходимо реализовать интерфейс JWTSubject в вашей модели Customer ( просто добавьте вещи, не нужно трогать другие методы)

    использовать Tymon \ JWTAuth \ Contracts \ JWTSubject;

    класс Customer расширяет Authenticatable реализует JWTSubject {

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }
    
    /**
     * Return a key value array, containing any custom claims 
     * to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    { 
        // just an example here, change it to whatever you want
        return [
           'picture' => 'picture', // array values are the fieldname in the DB
           'twitter' => 'twitter_url' 
        ];
    }
    ...
    
  4. Ваш контроллер должен реализовать соответствующую защиту в конструкторе и белый список метода входа в систему , поскольку во входящих заголовках нет JWT.

    // UserController publi c function __construct () {$ this-> middleware ('auth: users', ['кроме' => [' авторизоваться']]); }

    publi c function login () {$ credentials = request (['email', 'password']); // токен возвращается из попытки if (! $ token = auth () -> пытаюсь ($ credentials)) {return response () -> json (['error' => 'Unauthorized'], 401); } return response () -> json (['access_token' => $ token, 'token_type' => 'bearer', 'expires_in' => auth () -> factory () -> getTTL () * 60] ); } ... другие методы ...

Я бы начал с отказа от очевидного:

  • вы все еще можете войти в систему как пользователь (api guard )? Если да, попробуйте изменить драйвер на «JWT»
0 голосов
/ 27 февраля 2020

Сначала измените driver вашего охранника с token на session, а затем выполните следующие команды

php artisan cache:clear
php artisan config:cache
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...