[PHP|Laravel] Logowanie OAuth2

Siemka! Miło, że wpadłeś na mojego bloga. W tym wpisie będziemy ogarniać logowanie za pomocą OAuth2 do Twojej aplikacji.

Laravel Passport

Do stworzenia tego logowania będzie potrzebna biblioteka Laravel Passport, która posiada wsparcie dla OAuth2. Jeśli masz zainstalowaną tą bibliotekę, przejdź do następnego kroku. Jeśli nie zainstalowałeś jeszcze Laravel Passport, przejdź do wpisu Instalacja Laravel Passport.

Migracja

W celu utworzenia niezbędnych tabel do przechowywania klientów OAuth2 i tokenów dostępu, uruchom emigrację. Wykonaj następujące polecenie: php artisan migrate.

Klucze szyfrowania

W tym kroku wygenerujemy klucze Encryption keys i Personal access client niezbędne do działania uwierzytelniania i autoryzacji Laravel Passport. Wykonaj polecenie: php artisan passport:install.

Dodanie traita HasApiTokens

Jeśli wykonałeś już powyższe kroki, możesz teraz dodać traita HasApiTokens do modelu uzytkownika - User, który umożliwi użytkownikowi generowanie tokenów dostępowych Passport. Dzięki użyciu traitu HasApiTokens w klasie User, możesz łatwo zarządzać tokenami dostępu dla swoich użytkowników w aplikacji. Otwórz plik app/Models/User.php i dopisz następujący kod:

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    
}

Konfiguracja API guard

Teraz ustawimy guard API i sterownik, aby Laravel wiedział z czego korzystać przy uwierzytelnianiu i autoryzacji żądań. API guard korzysta z TokenGuard do uwierzytelniania użytkowników. Token dostępu jest generowany dla każdego uwierzytelnionego użytkownika i jest używany do autoryzacji żądań API. Otwórz plik config/auth.php i przejdź do sekcji guards. W tej sekcji musimy ustawić sterownik jako passport:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Trasy dla Laravel Passport

W tym korku utworzymy niezbędne dla Laravel Passport trasy. Otwórz plik app/Providers/AuthServiceProvider.php i dopisz w metodzie boot:

$this->registerPolicies();

Passport::routes();

Dodanie Middleware

W tym kroku dodamy dwa middleware: CreateFreshApiToken i CheckClientCredentials, które umożliwią uwierzytelnianie i autoryzację żądań API za pomocą Passport. Otwórz plik app/Http/Kernel.php, przejdź do grupy API i dodaj te dwa middleware:

protected $middlewareGroups = [
    'web' => [
        // reszta middleware'ów...
    ],

    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
        \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
    ],
];

Generowanie widoków

Możemy teraz wygenerować widoki dla rejestracji, logowania i resetowania hasła. Wykonaj polecenie: php artisan make:auth.

Sprawdź czy działa

Możesz teraz odpalić stronę logowania: http://localhost:8000/login i sprawdzić czy logowanie działa jak należy.

Logowanie przez Facebooka

Teraz czas na dodanie logowania poprzez Facebook. Na początku uzyskaj dwa klucze: FACEBOOK_CLIENT_ID i FACEBOOK_CLIENT_SECRET ze strony developers.facebook.com i dopisz je w pliku .env. Tak jak poniżej:

FACEBOOK_CLIENT_ID=your-facebook-client-id
FACEBOOK_CLIENT_SECRET=your-facebook-client-secret
FACEBOOK_REDIRECT_URI=http://your-app-url/callback/facebook

Możesz teraz pobrać rozszerzenie socialite: composer require laravel/socialite.

Po zainstalowaniu Socialite, przejdź do konfiguracji usług. Otwórz plik config/services.php i dopisz następujący fragment kodu:

'facebook' => [
    'client_id' => env('FACEBOOK_CLIENT_ID'),
    'client_secret' =f> env('FACEBOOK_CLIENT_SECRET'),
    'redirect' => env('FACEBOOK_REDIRECT_URI'),
],

W kontrolerze dodajmy metody obsługujące logowanie przez Facebooka:

use Laravel\Socialite\Facades\Socialite;

public function redirectToFacebook()
{
    return Socialite::driver('facebook')->redirect();
}

public function handleFacebookCallback()
{
    $user = Socialite::driver('facebook')->user();

    
}

Na pewno już się domyśliłeś, że trzeba dodać odpowiednie trasy do pliku routes/web.php:

Route::get('login/facebook', 'Auth\LoginController@redirectToFacebook');
Route::get('callback/facebook', 'Auth\LoginController@handleFacebookCallback');

Na koniec mała zmiana w widoku formularza logowania, a mianowicie dodanie przycisku logowania przez Facebooka:

<a href="{{ url('login/facebook') }}">Zaloguj się przez Facebooka</a>

Komentarze

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[PHP] Jak pobrać adres strony?