Фото автора Даниэль Макиннес на Расплескать
Laravel Nova доступен уже более года и я был приятно удивлен тем, насколько он расширяем, несмотря на то, что документация иногда бывает немного краткой. С тех пор, как работал на Бирже торгового покрытия Мне пришлось поработать над парой функций с Nova, и одной из них была функция безопасности – вход в социальные сети. Вы можете спросить, как социальные логины являются функцией безопасности для Laravel Nova, и простой ответ: Google G-Suite . На бирже торгового покрытия работает менее 5 сотрудников, поэтому действительно важно иметь возможность управлять доступом к административным зонам. Компания, использующая Google G-suite, может захотеть контролировать, какие пользователи могут входить в свое приложение Nova, основываясь на том, что у них есть адреса электронной почты, управляемые с помощью G-Suite, тогда вы можете обезопасить больше вещей, заставив учетную запись G-Suite использовать двухфакторную аутентификацию для входа.
Начиная этот проект, я собираюсь предположить, что у вас уже есть работающий проект Laravel Nova, в который вы можете добавить. Вам не нужна настройка G-Suite, чтобы следовать этому руководству, но вам может потребоваться что-то настроить, чтобы он работал безопасно и так, как вы хотите.
Установить Светскую львицу
Если вы еще не знаете, в Laravel есть пакет для входа в социальные сети под названием Socialite , который обычно используется для входа в социальные сети, и его можно использовать точно так же для Laravel Nova.
Для установки socialite мы используем следующую команду композитора:
composer require laravel/socialite
Затем нам просто нужно настроить облачный проект Google с помощью клиента oauth. Вы можете прочитать о социальных логинах и настроить их из этой части документации . Когда он запрашивает URL-адрес обратного вызова, мы просто будем использовать http://localhost/nova/google/callback . Как только мы это сделаем, мы сможем добавить недавно сгенерированный идентификатор клиента и секрет в наш файл .env.
GOOGLE_CLIENT_ID_=GOOGLE_CLIENT_SECRET=
Нам также необходимо добавить следующее в ваш config/services.php файл для работы с Socialite с использованием переменных среды, которые мы только что добавили в файл env.
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => '/nova/google/callback',
],
Создание нашей Страницы Входа в Систему
Следующий шаг довольно прост. Мы собираемся просто создать новое представление входа в систему, которое переопределит обычное, и вместо этого оно покажет простой знак Кнопка вместо обычной формы входа в систему с полями электронной почты и пароля.
Мы создаем этот файл по адресу resources/views/vendor/nova/auth/login.blade.php со следующим содержанием. Это переопределит страницу входа в систему по умолчанию для пакета nova. Возможно, вы захотите просмотреть его и настроить строку с указанием того, какие учетные записи вы можете использовать.
Добавление социального контроллера
Нам нужен очень простой контроллер для обработки различных методов, необходимых для обработки социальной аутентификации.
В этом контроллере у нас будет два доступных маршрута, как обычно для Laravel Socialite . Первый из них перенаправляется в Google для выполнения авторизации, а другой – просто обрабатывает обратный вызов после авторизации пользователя.
Для перенаправления в Google мы создадим метод под названием перенаправление в Google, который вызовет драйвер социальной сети Google. Мы также добавим дополнительную опцию под названием hd, значение которой будет нашим доменом G-Suite. Это просто означает, что мы можем попросить Google отобразить домен на нашей странице авторизации. Это избавит пользователя от необходимости вводить свой полный адрес электронной почты. Код выглядит следующим образом:
public function redirectToGoogle()
{
return Socialite::driver('google')
// Displays the G-Suite domain saving the user from typing their whole
// email address.
->with(['hd' => 'ylsideas.co'])
->redirect();
}
Наш следующий метод заключается в выполнении обратного вызова после того, как пользователь прошел аутентификацию в Google. Что мы сделаем, так это возьмем пользователя из драйвера социальной сети Google и проверим, соответствует ли возвращенный адрес электронной почты пользователя нашему домену.
После этих проверок мы выполним вызов firstOrCreate для пользовательской модели. Это означает, что первый пользователь будет создан, если он не существует, или мы извлекем его из базы данных, если он уже существует, используя адрес электронной почты в качестве уникального ключа.
Наш следующий шаг – передать нового пользователя в службу аутентификации и создать сеанс входа для пользователя.
После этого мы можем перенаправить пользователя обратно по указанному пути или просто на домашнюю страницу.
Наш код для метода должен выглядеть следующим образом:
public function processGoogleCallback(Request $request)
{
try {
$socialUser = Socialite::driver('google')->user();
} catch (InvalidStateException $exception) {
return redirect()->route('nova.login')
->withErrors([
'email' => [
__('Google Login failed, please try again.'),
],
]);
}
// Very Important! Stops anyone with any google accessing Nova!
if (! Str::endsWith($socialUser->getEmail(), 'ylsideas.co')) {
return redirect()->route('nova.login')
->withErrors([
'email' => [
__('Only ylsideas.co email addresses are accepted.'),
],
]);
}
$user = User::firstOrCreate(
['email' => $socialUser->getEmail()],
[
'name' => $socialUser->getName(),
'password' => Str::random(32),
]
);
$this->guard()->login($user);
return redirect()->intended(Nova::path());
}
Обратите внимание в processGoogleCallback, что в случае сбоя первых двух проверок пользователь возвращается на исходную страницу входа с ошибкой, которая может отображаться на странице, давая понять конечному пользователю, почему не удалось войти.
Если вам нужен полный файл, вы можете просмотреть его ниже:
Настройка маршрутов
Теперь мы создали контроллер, нам нужно всего лишь настроить несколько строк в поставщике услуг Nova и добавить наши новые маршруты для доступа к SocialLoginController, который мы создали на последнем шаге.
Мы можем сделать это, заменив содержимое метода маршрутов поставщика услуг Nova приведенным ниже примером.
Это приведет к удалению маршрутов регистрации, сброса пароля и входа в систему. Вместо этого мы добавляем наши собственные маршруты входа, которые будут использовать контроллер социального входа, который мы создали на последнем шаге.
Проверяя это
Это должно быть довольно легко быстро проверить. Если вы просто зайдете на страницу/nova/входа на свой сайт, она должна направить вас на новую страницу входа, которая выглядит примерно так:
Затем, когда вы нажмете кнопку входа, вы попадете на страницу Google. После завершения процесса авторизации вы будете перенаправлены обратно в приложение и на главный экран.
Если вы просто хотите увидеть весь проект вместе, вы можете просмотреть его на github .
Я Питер Фокс, разработчик программного обеспечения в Великобритании, который, помимо прочего, работает с Laravel. Если вы хотите узнать обо мне больше, вы можете по адресу https://www.peterfox.me и не стесняйтесь следовать за мной @ Хитрый Firefox в твиттере для получения дополнительных советов и руководств по Laravel.
Оригинал: “https://dev.to/slyfirefox/laravel-nova-implementing-social-logins-49ki”