Przewiń do głównej treści

Implementacja logowania przez Microsoft w aplikacji Laravel 10 z Fortify

·811 słów·4 min· loading · loading ·

Implementacja logowania przez Microsoft w aplikacji Laravel 10 z Fortify
#

Logowanie społecznościowe stało się nieodłączną częścią współczesnych aplikacji webowych. W tym artykule pokażę, jak zaimplementować logowanie przez konto Microsoft w aplikacji Laravel 10 z wykorzystaniem pakietu Fortify. Przejdziemy krok po kroku przez cały proces - od instalacji niezbędnych pakietów, przez konfigurację projektu, aż po rozwiązanie typowych problemów.

Wymagane pakiety
#

Zacznijmy od instalacji niezbędnych pakietów:

composer require laravel/socialite socialiteproviders/microsoft

Laravel Socialite to oficjalny pakiet Laravel do obsługi logowania społecznościowego, natomiast socialiteproviders/microsoft to rozszerzenie, które dodaje wsparcie dla Microsoft OAuth.

Konfiguracja EventServiceProvider
#

Po zainstalowaniu pakietów musimy zaktualizować nasz EventServiceProvider, aby obsługiwać logowanie przez Microsoft. W pliku app/Providers/EventServiceProvider.php dodaj następujący kod:

protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        \SocialiteProviders\Microsoft\MicrosoftExtendSocialite::class.'@handle',
    ],
];

Uwaga: Zwróć szczególną uwagę na poprawność nazwy klasy MicrosoftExtendSocialite. Częstym błędem jest użycie nieistniejącej klasy MicrosoftExtendedServiceProvider.

Rejestracja aplikacji w Microsoft Azure
#

Aby umożliwić logowanie przez Microsoft, musimy zarejestrować naszą aplikację w portalu Azure:

  1. Zaloguj się do Azure Portal
  2. Przejdź do “Microsoft Entra ID” (dawniej Azure Active Directory)
  3. Wybierz “Rejestracje aplikacji” → “Nowa rejestracja”
  4. Nadaj nazwę aplikacji
  5. Wybierz typ konta (zazwyczaj “Konta w dowolnym katalogu organizacji i osobiste konta Microsoft”)
  6. Ustaw adres przekierowania URI: https://twoja-domena.pl/login/microsoft/callback
  7. Po rejestracji zanotuj “Identyfikator aplikacji (klienta)” i utwórz “Klucz tajny klienta”

Poniższy film instruktażowy szczegółowo pokazuje proces rejestracji aplikacji w Microsoft Azure oraz konfiguracji niezbędnych uprawnień:

Konfiguracja aplikacji Microsoft w Azure Portal

Film ten jest szczególnie pomocny przy pierwszej konfiguracji, ponieważ interfejs Azure Portal może być nieco przytłaczający dla początkujących.

Konfiguracja Laravel
#

Następnie dodaj konfigurację OAuth Microsoft do pliku config/services.php:

'microsoft' => [    
    'client_id' => env('MICROSOFT_CLIENT_ID'),  
    'client_secret' => env('MICROSOFT_CLIENT_SECRET'),  
    'redirect' => env('MICROSOFT_REDIRECT_URI'),
    'tenant' => env('MICROSOFT_TENANT_ID', 'common'),
],

Zaktualizuj plik .env o odpowiednie zmienne:

MICROSOFT_CLIENT_ID=twoj-client-id
MICROSOFT_CLIENT_SECRET=twoj-client-secret
MICROSOFT_REDIRECT_URI=https://twoja-domena.pl/login/microsoft/callback

Aktualizacja modelu User
#

Aby przechowywać informacje o koncie Microsoft, musimy zaktualizować model User. Najpierw utwórzmy migrację:

php artisan make:migration add_microsoft_auth_to_users_table

W pliku migracji dodajmy potrzebne kolumny:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->text('microsoft_id')->nullable();
        $table->text('microsoft_token')->nullable();
        $table->text('microsoft_refresh_token')->nullable();
        $table->timestamp('token_expires_at')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn([
            'microsoft_id',
            'microsoft_token',
            'microsoft_refresh_token',
            'token_expires_at'
        ]);
    });
}

Uwaga: Zwróć uwagę, że używamy typu text zamiast string dla pól przechowujących tokeny. Tokeny OAuth od Microsoft są dość długie i mogą przekroczyć domyślną długość 255 znaków kolumny VARCHAR.

Następnie zaktualizujmy model User w app/Models/User.php:

protected $fillable = [
    'name',
    'email',
    'password',
    'microsoft_id',
    'microsoft_token',
    'microsoft_refresh_token',
    'token_expires_at'
];

/**
 * Aktualizuj dane Microsoft dla użytkownika
 */
public function updateMicrosoftData($microsoftUser)
{
    $this->microsoft_id = $microsoftUser->getId();
    $this->microsoft_token = $microsoftUser->token;
    
    if (isset($microsoftUser->refreshToken)) {
        $this->microsoft_refresh_token = $microsoftUser->refreshToken;
    }
    
    if (isset($microsoftUser->expiresIn)) {
        $this->token_expires_at = now()->addSeconds($microsoftUser->expiresIn);
    }
    
    return $this->save();
}

Tworzenie tras (routes)
#

Teraz dodajmy trasy do obsługi logowania przez Microsoft w pliku routes/web.php:

use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;

Route::get('/login/microsoft', function () {
    return Socialite::driver('microsoft')->redirect();
})->name('login.microsoft');

Route::get('/login/microsoft/callback', function () {
    $microsoftUser = Socialite::driver('microsoft')->user();
    
    // Sprawdź, czy użytkownik istnieje w bazie danych
    $user = User::where('email', $microsoftUser->getEmail())->first();
    
    // Jeśli użytkownik istnieje, aktualizuj jego dane Microsoft i zaloguj go
    if ($user) {
        $user->updateMicrosoftData($microsoftUser);
        Auth::login($user);
        return redirect()->intended('/dashboard');
    }
    
    // Jeśli użytkownik nie istnieje, przekieruj do strony logowania z komunikatem
    return redirect()->route('login')
        ->with('error', 'Konto z tym adresem e-mail nie istnieje. Proszę najpierw zarejestrować się.');
});

Ta implementacja tylko sprawdza, czy użytkownik istnieje w bazie danych, nie tworząc nowych kont. Jeśli chcesz również umożliwić tworzenie nowych kont, możesz zmodyfikować kod:

// Alternatywna wersja umożliwiająca rejestrację
if (!$user) {
    $user = User::create([
        'name' => $microsoftUser->getName(),
        'email' => $microsoftUser->getEmail(),
        'password' => Hash::make(Str::random(24)),
    ]);
}

Dodanie przycisku logowania
#

Na koniec dodajmy przycisk logowania przez Microsoft do naszego formularza logowania:

<a href="{{ route('login.microsoft') }}" class="btn btn-light">
    <i class="fab fa-microsoft"></i> Zaloguj przez Microsoft
</a>

Rozwiązywanie problemów
#

Problem z długością tokena
#

Jednym z najczęstszych problemów jest błąd związany z długością tokena otrzymanego od Microsoft:

SQLSTATE: String data, right truncated: 1406 Data too long for column 'microsoft_token'

Jeśli napotkasz taki problem, a nie używałeś typu text w oryginalnej migracji, możesz stworzyć nową migrację, która zwiększy rozmiar kolumn:

php artisan make:migration increase_microsoft_token_column_size

W pliku migracji:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class IncreaseMicrosoftTokenColumnSize extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->text('microsoft_token')->change();
            $table->text('microsoft_refresh_token')->nullable()->change();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('microsoft_token')->change();
            $table->string('microsoft_refresh_token')->nullable()->change();
        });
    }
}

Aby używać metody change() w migracjach, należy zainstalować pakiet:

composer require doctrine/dbal

Problem z klasą w EventServiceProvider
#

Częstym błędem jest niewłaściwa nazwa klasy w EventServiceProvider. Upewnij się, że używasz:

\SocialiteProviders\Microsoft\MicrosoftExtendSocialite::class.'@handle'

a nie:

\SocialiteProviders\Microsoft\MicrosoftExtendedServiceProvider::class

Podsumowanie
#

W tym artykule pokazałem, jak zaimplementować logowanie przez Microsoft w aplikacji Laravel 10 z Fortify. Przedstawiony kod można łatwo dostosować do własnych potrzeb, na przykład dodając więcej pól z informacjami o użytkowniku lub integrując logowanie z innymi dostawcami OAuth.

Takie rozwiązanie zwiększa wygodę korzystania z aplikacji i może znacząco zmniejszyć barierę wejścia dla nowych użytkowników, szczególnie w środowiskach korporacyjnych, gdzie konta Microsoft są powszechne.

Pamiętaj, że przy wdrażaniu logowania społecznościowego zawsze warto zadbać o odpowiednie zabezpieczenia i przetestować różne scenariusze logowania przed wdrożeniem na produkcję.