1. Пакеты
  2. Laravel Socialite

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

Помимо типичной аутентификации на основе форм, Laravel также предоставляет простой и удобный способ аутентификации с поставщиками OAuth с использованием Laravel Socialite. В настоящее время Socialite поддерживает аутентификацию через Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, Bitbucket и Slack.

Примечание Адаптеры для других платформ доступны на сайте сообщества Socialite Providers.

Установка

Для начала работы с Socialite используйте менеджер пакетов Composer для добавления пакета в зависимости вашего проекта:

composer require laravel/socialite

Обновление 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();

Области Slack Bot

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();
});

Получение сведений о пользователе из токена (OAuth2)

Если у вас уже есть действующий токен доступа для пользователя, вы можете получить его сведения о пользователе, используя метод userFromToken Socialite:

use Laravel\Socialite\Facades\Socialite;
 
$user = Socialite::driver('github')->userFromToken($token);

Получение сведений о пользователе из токена и секрета (OAuth1)

Если у вас уже есть действующий токен и секрет для пользователя, вы можете получить его сведения о пользователе, используя метод 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.