Классу TokenGuard всегда нужен api_token

Я использую AngularJs и Laravel 5.4.

В охраннике по умолчанию я изменил web guard на api. Наконец, это выглядит так, как показано ниже.

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

когда я отправляю запрос, используя имя пользователя и пароль от Angular Js.... Я всегда получаю неверные учетные данные, потому что...

В классе TokenGuard есть метод validate, который ожидает значение api_token, но я нахожусь на странице входа.

Я предполагаю, что для получения токена мне нужно $this->guard(web) в методе входа?

Это правильный подход или я что-то упустил?


person Community    schedule 13.02.2017    source источник


Ответы (1)


По умолчанию все маршруты, определенные в routes/api.php, имеют промежуточное ПО api, как определено в app/Providers/RouteServiceProvider::mapApiRoutes(). Поэтому всегда нужно передавать api_token.

Что вы можете сделать, так это определить в ваших маршрутах API маршрут входа в систему следующим образом.

Route::post('login', 'api\AuthController@login'); //out of the group

И пост из AngularJS

$http.post({
    url: 'http://localhost/api/login',
    data: $scope.userda,
    headers: {
        Authorization: ''
    }
}).then(...)

Затем определите все остальные маршруты в группе с auth:api

Route::group(['middleware' => 'auth:api'], function(){
    //Other routes here
});

В angular установите заголовки авторизации со значением api_token. Таким образом, перед входом в систему он будет пустым, а после входа в систему будет иметь значение api_token пользователя.

person EddyTheDove    schedule 13.02.2017
comment
Вам не хватает закрывающей одинарной кавычки в вашей цитате здесь auth:api и, во-вторых, как маршрут входа можно обернуть промежуточным программным обеспечением auth:api? Токен в данный момент отсутствует. Мне нужен токен с использованием имени пользователя и пароля на моей странице входа. Только тогда я смогу совершать дальнейшие звонки, используя токен. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация по моему вопросу. - person ; 13.02.2017
comment
Мой маршрут входа находится вне группы. - person EddyTheDove; 13.02.2017
comment
Как я могу войти в систему, используя TokenGuard? В классе TokenGuard есть метод Validate, которому нужен токен... Но мой запрос на вход еще не получил токен. Я имел в виду, что вы напишете в методе входа в контроллер, чтобы получить имя пользователя и пароль, проверенные от tokenguard? - person ; 13.02.2017
comment
О, теперь я понимаю, что вы имеете в виду. Определите свой маршрут входа в routes/web.php. У вас будет доступ к обычному Auth. Затем просто верните оттуда Json() со всеми данными пользователя. и все маршруты проходят через api для аутентификации TokenGuard. - person EddyTheDove; 13.02.2017
comment
почему веб-охрана? Почему не охранять API? Могу ли я войти в систему с помощью API Guard? - person ; 13.02.2017
comment
Защита API работает только с api_token. И как вы сказали. У вас нет предварительного входа в систему, поэтому API GUAD не может вас аутентифицировать. - person EddyTheDove; 13.02.2017
comment
Должен ли я смешивать SessionGuard и TokenGuard? Безопасно ли использовать Laravel TokenGuard или мне стоит выбрать JWT? - person ; 13.02.2017
comment
Я бы не рекомендовал смешивать, так как никогда не пробовал такое и ничего не знаю о побочных эффектах. Я использую ту же установку, что и вы. Единственное отличие состоит в том, что я вхожу в систему из обычной формы (PHP) и перенаправляюсь на angular с уже установленным api_token. - person EddyTheDove; 13.02.2017
comment
Вы тоже смешиваете вещи. Я думаю, что вы используете и токенгард, и сессионную охрану - person ; 13.02.2017
comment
Неа. Моя форма входа - это чисто PHP в /login. Мое угловое приложение находится в /app. Маршрут app защищен авторизацией Web guard, но все, что проходит через api, использует api guard. Я понимаю, что вы имеете в виду, но в моих контроллерах Auth::check() не будет работать, потому что запрос приходит в формате JSON. Но если под смешиванием вы подразумеваете, что я использую обе защиты, то да, но на разных уровнях. Я просто думаю, что мне так легче. - person EddyTheDove; 13.02.2017