Документация Laravel 10.x
Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.
Помимо типичной аутентификации на основе форм, Laravel также предоставляет простой и удобный способ аутентификации с поставщиками OAuth с использованием Laravel Socialite. В настоящее время Socialite поддерживает аутентификацию через Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, Bitbucket и Slack.
Примечание Адаптеры для других платформ доступны на сайте сообщества Socialite Providers.
Для начала работы с Socialite используйте менеджер пакетов Composer для добавления пакета в зависимости вашего проекта:
composer require laravel/socialite
При обновлении до новой основной версии Socialite важно внимательно изучить руководство по обновлению.
Перед использованием Socialite вам необходимо добавить учетные данные для поставщиков OAuth, которые использует ваше приложение. Обычно эти учетные данные можно получить, создав "разработческое приложение" в панели управления сервиса, с которым вы собираетесь аутентифицироваться.
Эти учетные данные следует разместить в файле конфигурации вашего приложения config/services.php
и использовать ключи facebook
, twitter
(OAuth 1.0), twitter-oauth-2
(OAuth 2.0), linkedin-openid
, google
, github
, gitlab
, bitbucket
или slack
, в зависимости от поставщиков, необходимых вашему приложению:
'github' => [ 'client_id' => env('GITHUB_CLIENT_ID'), 'client_secret' => env('GITHUB_CLIENT_SECRET'), 'redirect' => 'http://example.com/callback-url',],
Примечание Если опция
redirect
содержит относительный путь, он автоматически будет преобразован в полностью квалифицированный URL.
Для аутентификации пользователей с использованием поставщика OAuth вам понадобятся два маршрута: один для перенаправления пользователя на поставщика OAuth, и другой для получения обратного вызова от поставщика после аутентификации. Приведенные ниже маршруты демонстрируют реализацию обоих маршрутов:
use Laravel\Socialite\Facades\Socialite; Route::get('/auth/redirect', function () { return Socialite::driver('github')->redirect();}); Route::get('/auth/callback', function () { $user = Socialite::driver('github')->user(); // $user->token});
Метод redirect
, предоставленный фасадом Socialite
, отвечает за перенаправление пользователя на поставщика OAuth, а метод user
проанализирует входящий запрос и извлечет информацию о пользователе от поставщика после подтверждения запроса на аутентификацию.
После того как пользователь получен от поставщика OAuth, вы можете определить, существует ли пользователь в базе данных вашего приложения, и аутентифицировать пользователя. Если пользователь не существует в базе данных вашего приложения, вы обычно создаете новую запись в вашей базе данных для представления пользователя:
use App\Models\User;use Illuminate\Support\Facades\Auth;use Laravel\Socialite\Facades\Socialite; Route::get('/auth/callback', function () { $githubUser = Socialite::driver('github')->user(); $user = User::updateOrCreate([ 'github_id' => $githubUser->id, ], [ 'name' => $githubUser->name, 'email' => $githubUser->email, 'github_token' => $githubUser->token, 'github_refresh_token' => $githubUser->refreshToken, ]); Auth::login($user); return redirect('/dashboard');});
Примечание Для получения дополнительной информации о том, какие сведения о пользователе доступны от конкретных поставщиков OAuth, ознакомьтесь с документацией по получению сведений о пользователе.
Перед перенаправлением пользователя вы можете использовать метод scopes
для указания "областей", которые должны быть включены в запрос аутентификации. Этот метод объединит все ранее указанные области с теми, которые вы указываете:
use Laravel\Socialite\Facades\Socialite; return Socialite::driver('github') ->scopes(['read:user', 'public_repo']) ->redirect();
Вы можете перезаписать все существующие области в запросе аутентификации, используя метод setScopes
:
return Socialite::driver('github') ->setScopes(['read:user', 'public_repo']) ->redirect();
API Slack предоставляет различные типы токенов доступа, каждый из которых имеет свой набор областей разрешений. Socialite совместим со следующими типами токенов Slack:
xoxb-
)xoxp-
)По умолчанию драйвер slack
будет генерировать токен user
, и вызов метода user
драйвера вернет сведения о пользователе.
Токены бота полезны в основном, если ваше приложение будет отправлять уведомления во внешние рабочие пространства Slack, которые принадлежат пользователям вашего приложения. Чтобы сгенерировать токен бота, вызовите метод asBotUser
перед перенаправлением пользователя в Slack для аутентификации:
return Socialite::driver('slack') ->asBotUser() ->setScopes(['chat:write', 'chat:write.public', 'chat:write.customize']) ->redirect();
Кроме того, вы должны вызвать метод asBotUser
перед вызовом метода user
после перенаправления Slack пользователя обратно в ваше приложение после аутентификации:
$user = Socialite::driver('slack')->asBotUser()->user();
При генерации токена бота метод user
по-прежнему вернет экземпляр Laravel\Socialite\Two\User
; однако будут заполнены только свойства token
. Этот токен можно сохранить для отправки уведомлений в рабочие пространства Slack аутентифицированных пользователей.
Несколько поставщиков OAuth поддерживают другие необязательные параметры в запросе перенаправления. Чтобы включить любые необязательные параметры в запросе, вызовите метод with
с ассоциативным массивом:
use Laravel\Socialite\Facades\Socialite; return Socialite::driver('google') ->with(['hd' => 'example.com']) ->redirect();
Внимание При использовании метода
with
будьте осторожны и не передавайте зарезервированные ключевые слова, такие какstate
илиresponse_type
.
После того как пользователь перенаправлен обратно на маршрут обратного вызова аутентификации вашего приложения, вы можете получить сведения о пользователе, используя метод user
Socialite. Объект пользователя, возвращаемый методом user
, предоставляет различные свойства и методы, которые вы можете использовать для хранения информации о пользователе в своей собственной базе данных.
Этот объект может иметь различные свойства и методы, в зависимости от того, поддерживает ли поставщик OAuth, с которым вы производите аутентификацию, OAuth 1.0 или OAuth 2.0:
use Laravel\Socialite\Facades\Socialite; Route::get('/auth/callback', function () { $user = Socialite::driver('github')->user(); // Поставщики OAuth 2.0... $token = $user->token; $refreshToken = $user->refreshToken; $expiresIn = $user->expiresIn; // Поставщики OAuth 1.0... $token = $user->token; $tokenSecret = $user->tokenSecret; // Все поставщики... $user->getId(); $user->getNickname(); $user->getName(); $user->getEmail(); $user->getAvatar();});
Если у вас уже есть действующий токен доступа для пользователя, вы можете получить его сведения о пользователе, используя метод userFromToken
Socialite:
use Laravel\Socialite\Facades\Socialite; $user = Socialite::driver('github')->userFromToken($token);
Если у вас уже есть действующий токен и секрет для пользователя, вы можете получить его сведения о пользователе, используя метод userFromTokenAndSecret
Socialite:
use Laravel\Socialite\Facades\Socialite; $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);
Метод stateless
можно использовать для отключения проверки состояния сеанса. Это полезно при добавлении социальной аутентификации к безсостоятельному API, не использующему сеансов на основе cookie:
use Laravel\Socialite\Facades\Socialite; return Socialite::driver('google')->stateless()->user();
Внимание Бессостоятельная аутентификация не поддерживается для драйвера Twitter OAuth 1.0.