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:
- Zaloguj się do Azure Portal
- Przejdź do “Microsoft Entra ID” (dawniej Azure Active Directory)
- Wybierz “Rejestracje aplikacji” → “Nowa rejestracja”
- Nadaj nazwę aplikacji
- Wybierz typ konta (zazwyczaj “Konta w dowolnym katalogu organizacji i osobiste konta Microsoft”)
- Ustaw adres przekierowania URI:
https://twoja-domena.pl/login/microsoft/callback
- 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ń:
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ę.