Вступление

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

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

 

Обновление Socialite

При обновлении до новой основной версии Socialite важно внимательно изучить руководство по обновлению .

 

Монтаж

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

composer require laravel/socialite

 

Конфигурация

Перед использованием Socialite вам также необходимо добавить учетные данные для служб OAuth, которые использует ваше приложение. Эти учетные данные должны быть помещены в вашем конфигурационном файле, и использовать ключ , , , , , или , в зависимости от провайдеров приложение требует. Например:config/services.phpfacebooktwitterlinkedingooglegithubgitlabbitbucket

'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => 'http://your-callback-url',
],

Если redirectпараметр содержит относительный путь, он будет автоматически преобразован в полный URL-адрес.

 

Маршрутизация

Далее вы готовы аутентифицировать пользователей! Вам понадобятся два маршрута: один для перенаправления пользователя к поставщику OAuth, а другой для получения обратного вызова от поставщика после аутентификации. Мы получим доступ к Socialite, используя Socialiteфасад:

<?php

namespace App\Http\Controllers\Auth;

use Socialite;

class LoginController extends Controller
{
    /**
     * Redirect the user to the GitHub authentication page.
     *
     * @return \Illuminate\Http\Response
     */
    public function redirectToProvider()
    {
        return Socialite::driver('github')->redirect();
    }

    /**
     * Obtain the user information from GitHub.
     *
     * @return \Illuminate\Http\Response
     */
    public function handleProviderCallback()
    {
        $user = Socialite::driver('github')->user();

        // $user->token;
    }
}

redirectМетод берет на себя отправку пользователя к провайдеру OAuth, в то время как userметод будет читать входящий запрос и получить информацию пользователя от провайдера.

Вам нужно будет определить маршруты к вашим методам контроллера:

Route::get('login/github', 'Auth\LoginController@redirectToProvider');
Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');

 

Необязательные параметры

Ряд поставщиков OAuth поддерживают необязательные параметры в запросе на перенаправление. Чтобы включить в запрос любые необязательные параметры, вызовите withметод с ассоциативным массивом:

return Socialite::driver('google')
    ->with(['hd' => 'example.com'])
    ->redirect();

При использовании withметода будьте осторожны, чтобы не передавать зарезервированные ключевые слова, такие как stateили response_type.

 

Области доступа

Перед перенаправлением пользователя вы также можете добавить дополнительные «области» к запросу, используя scopesметод. Этот метод объединит все существующие области с теми, которые вы предоставляете:

return Socialite::driver('github')
    ->scopes(['read:user', 'public_repo'])
    ->redirect();

Вы можете перезаписать все существующие области, используя setScopesметод:

return Socialite::driver('github')
    ->setScopes(['read:user', 'public_repo'])
    ->redirect();

 

Аутентификация без сохранения состояния

Этот statelessметод может использоваться для отключения проверки состояния сеанса. Это полезно при добавлении социальной аутентификации в API:

return Socialite::driver('google')->stateless()->user();

 

Получение данных пользователя

Получив пользовательский экземпляр, вы можете получить еще несколько подробностей о пользователе:

$user = Socialite::driver('github')->user();

// OAuth Two Providers
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;

// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;

// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();

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

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

$user = Socialite::driver('github')->userFromToken($token);

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

Если у вас уже есть действительная пара токенов / секретов для пользователя, вы можете получить их данные, используя userFromTokenAndSecretметод:

$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);