Компонент Laravel 5.3 Passport выглядит довольно круто, но я немного путаюсь с ним.
В документации Passport находится под API-аутентификацией, и, если установить config / auth.php, он изменит драйвер на «паспорт» охранника «api».
В Laravel 5.3 есть web.php и api.php для разных групп маршрутов для использования веб-промежуточного или промежуточного программного обеспечения API.
После установки Passport, есть шаг для добавления Passport: маршруты () в AuthServiceProvider. Когда я запускаю route: list, он покажет, что все новые маршруты используют веб-интерфейс и промежуточное ПО аутентификации.
Мой вопрос, почему эти паспортные маршруты с использованием веб-промежуточного программного обеспечения? Насколько я понимаю, Passport должен работать для аутентификации API без сохранения состояния, а промежуточное веб-программное обеспечение — нет.
Я тоже столкнулся с этой проблемой, пока не понял, что мое понимание принципа работы паспорта неверно.
Паспорт — это предоставление клиентскому приложению данных пользователя с согласия этого пользователя (так работает OAuth2). Поэтому, когда клиентское приложение пытается получить токен доступа, который в конечном итоге предоставит доступ к данным этого пользователя, необходимо получить согласие этого пользователя. Промежуточное веб-программное обеспечение действует как слой для получения согласия этого пользователя. Чтобы подписать согласие, пользователь должен сначала войти в систему, иначе не будет никаких доказательств того, что он является действительным пользователем.
Чтобы лучше понять, рассмотрим сценарий, в котором ваше приложение пытается реализовать функцию «Войти в Google». Вы помещаете кнопку, которая перенаправляет в Google на странице входа в систему, после перенаправления пользователь входит в свою учетную запись Google, подписывает согласие и перенаправляется обратно в ваше приложение с кодом авторизации. Это просто так, здесь Google — это приложение, которое вы создаете, а другое приложение — это клиентское приложение.
Тем не менее лучший способ понять это, если сделать практическую реализацию. Просто создайте новое приложение в laravel и поместите этот код в файл route / web.php.
Route::get('/redirect', function () {
$query = http_build_query([
'client_id' => 'YOUR APP'S CLIENT ID',
'redirect_uri' => 'THE CALLBACK YOU GAVE DURING CREATING THE CLIENT',
'response_type' => 'code',
'scope' => '',
]);
return redirect('http://your-app.com/oauth/authorize?'.$query);
});
Затем посетите новое приложение с /redirect
маршрут. Убедитесь, что ваше основное приложение тоже работает.
Кажется, я решил это.
Сначала я добавил и настроил промежуточное программное обеспечение CORS. https://github.com/barryvdh/laravel-cors
Затем я обернул маршруты Passport в группу маршрутов, отредактировав приложение / Providers / AuthServiceProvider.php
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Route::group(['prefix' => 'api', 'middleware' => 'cors'], function() {
Passport::routes();
});
}
Теоретически, если вы хотите использовать службу oauth вне вашего API, у вас может быть два экземпляра маршрутов Passport, один с префиксом / api и промежуточным программным обеспечением cors, а другой без, так что вы не потеряете перекрестное происхождение. защита при использовании oauth в браузере.