Uwierzytelnianie społecznościowe stało się niezbędne dla nowoczesnych aplikacji internetowych, gdzie ponad 90% użytkowników woli logować się używając swoich istniejących kont społecznościowych zamiast tworzyć nowe hasła. W tym kompleksowym przewodniku zaimplementujemy funkcjonalność logowania społecznościowego w aplikacji Laravel używając Laravel Socialite, obejmując zarówno uwierzytelnianie Google jak i Facebook od konfiguracji po wdrożenie produkcyjne.
📋 Spis treści
- 🔐 Implementacja logowania społecznościowego w Laravel: Kompletny przewodnik obejmujący uwierzytelnianie Google i Facebook
- 📋 Spis treści
- Wprowadzenie
- Wymagania wstępne
- Konfiguracja poświadczeń OAuth
- Kroki implementacji
- Testowanie implementacji
- Typowe problemy i rozwiązania
- Rozważania bezpieczeństwa
- Podsumowanie
Wprowadzenie
Logowanie społecznościowe zapewnia płynne doświadczenie uwierzytelniania dla Twoich użytkowników, pozwalając im zalogować się używając swoich istniejących kont Google lub Facebook. To podejście oferuje kilka korzyści:
- Zmniejszone tarcie: Użytkownicy nie muszą pamiętać kolejnego hasła
- Szybsza rejestracja: Tworzenie konta zajmuje sekundy zamiast minut
- Lepsze bezpieczeństwo: Wykorzystuje solidne bezpieczeństwo głównych platform
- Lepsze dane użytkowników: Dostęp do zweryfikowanych informacji profilowych
Ten przewodnik przeprowadzi Cię przez kompletny proces implementacji, od konfiguracji poświadczeń OAuth po obsługę tworzenia użytkowników i uwierzytelniania w środowiskach deweloperskich i produkcyjnych.
Wymagania wstępne
Przed rozpoczęciem upewnij się, że masz:
- Aplikację Laravel 10+
- PHP 8.1 lub wyższe
- Zainstalowany Composer
- Podstawowe zrozumienie uwierzytelniania Laravel
- Dostęp do Google Cloud Console i Facebook Developers
- Certyfikat SSL dla wdrożenia produkcyjnego
Konfiguracja poświadczeń OAuth
Konfiguracja OAuth Google
1. Konfiguracja ekranu zgody
-
Przejdź do Google Cloud Console
-
Utwórz nowy projekt lub wybierz istniejący
-
Przejdź do "APIs & Services" > "OAuth consent screen"
-
Wybierz typ użytkownika:
- Dla rozwoju/testowania: Wybierz "External"
- Pozwala na testowanie z dowolnym kontem Google
- Aplikacja pozostaje w trybie testowym
- Wsparcie dla do 100 użytkowników testowych
- Brak weryfikacji wymaganej dla testowania
- Dla aplikacji produkcyjnych/wewnętrznych: Wybierz "Internal"
- Tylko dla organizacji Google Workspace
- Ograniczone do użytkowników organizacji
- Brak weryfikacji wymaganej
- Automatyczna aprobata dla użytkowników wewnętrznych
- Dla rozwoju/testowania: Wybierz "External"
-
Wypełnij wymagane informacje o aplikacji:
App name: Nazwa Twojej Aplikacji User support email: twó[email protected] Developer contact information: twó[email protected] App logo: (opcjonalne ale zalecane) App domain: twoja-domena.com (dla produkcji) -
Ważne: Dodaj zakresy, których będziesz potrzebować:
../auth/userinfo.email(aby uzyskać email użytkownika)../auth/userinfo.profile(aby uzyskać informacje profilowe użytkownika)
2. Tworzenie poświadczeń OAuth
-
Przejdź do "APIs & Services" > "Credentials"
-
Kliknij "Create Credentials" > "OAuth client ID"
-
Wybierz "Web application" jako typ aplikacji
-
Ustaw opisową nazwę dla swojego klienta OAuth
-
Dodaj autoryzowane URI przekierowania:
- Rozwój:
http://localhost/auth/google/callback - Produkcja:
https://twoja-domena.com/auth/google/callback
Uwaga: Dla konfiguracji Docker użyj
http://localhostbez numerów portów - Rozwój:
-
Kliknij "Create"
-
Zapisz swój Client ID i Client Secret bezpiecznie
Pro Tip: Możesz utworzyć osobne klienty OAuth dla środowisk deweloperskich i produkcyjnych dla lepszej izolacji bezpieczeństwa.
Konfiguracja OAuth Facebook
1. Tworzenie konta biznesowego
- Przejdź do Facebook Business
- Kliknij "Create Account"
- Wypełnij informacje o swojej firmie:
Business Name: Nazwa Twojej Firmy Business Email: [email protected] Business Address: Twój rzeczywisty adres firmy Business Phone Number: Twój numer kontaktowy - Zweryfikuj swój email biznesowy
- Uzupełnij szczegóły firmy:
- Kategoria branżowa
- Typ biznesu
- Główna działalność biznesowa
2. Tworzenie konta deweloperskiego
- Przejdź do Facebook Developers
- Kliknij "Get Started" i zaloguj się swoim kontem biznesowym
- Zaakceptuj Facebook Platform Terms and Policies
- Uzupełnij rejestrację dewelopera:
Developer contact email: [email protected] Developer website: https://twoja-domena.com Privacy policy URL: https://twoja-domena.com/privacy
3. Tworzenie nowej aplikacji
- W konsoli Facebook Developers kliknij "Create App"
- Wybierz "Consumer" jako typ aplikacji (dla uwierzytelniania użytkowników)
- Wypełnij podstawowe informacje o aplikacji:
App Name: Nazwa Twojej Aplikacji App Contact Email: [email protected] Business Account: Wybierz swoje konto biznesowe - Kliknij "Create App"
4. Konfiguracja Facebook Login
-
W dashboardzie aplikacji znajdź "Facebook Login" i kliknij "Set up"
-
Wybierz platformę "Web"
-
Wprowadź swój Site URL:
http://localhost(dla rozwoju) -
Przejdź do Facebook Login > Settings w lewym pasku bocznym
-
Skonfiguruj ustawienia OAuth:
Client OAuth Login: Yes Web OAuth Login: Yes Force Web OAuth Reauthentication: No Embedded Browser OAuth Login: Yes (dla mobilnego web) -
Dodaj URI przekierowania OAuth:
- Rozwój:
http://localhost/auth/facebook/callback - Produkcja:
https://twoja-domena.com/auth/facebook/callback
- Rozwój:
-
Skonfiguruj domeny aplikacji:
- Dodaj
localhostdla rozwoju - Dodaj swoją domenę produkcyjną gdy będziesz gotowy
- Dodaj
-
Ważne: Zażądaj wymaganych uprawnień:
email(niezbędne dla identyfikacji użytkownika)public_profile(dla podstawowych informacji profilowych)
Uwaga bezpieczeństwa: Facebook wymaga HTTPS w produkcji. Podczas rozwoju dodaj swoją aplikację do "Development Mode" aby pozwolić na HTTP.
Kroki implementacji
Instalacja wymaganych pakietów
Zainstaluj pakiet Laravel Socialite:
composer require laravel/socialite
Opcjonalnie: Zainstaluj dodatkowe pakiety dla rozszerzonej funkcjonalności:
composer require intervention/image # Dla przetwarzania obrazów profilowych
composer require spatie/laravel-permission # Dla kontroli dostępu opartej na rolach
Konfiguracja
1. Aktualizacja zmiennych środowiskowych
Dodaj te do pliku .env:
# Google OAuth
GOOGLE_CLIENT_ID=twój-google-client-id
GOOGLE_CLIENT_SECRET=twój-google-client-secret
GOOGLE_REDIRECT_URI="${APP_URL}/auth/google/callback"
# Facebook OAuth
FACEBOOK_CLIENT_ID=twój-facebook-app-id
FACEBOOK_CLIENT_SECRET=twój-facebook-app-secret
FACEBOOK_REDIRECT_URI="${APP_URL}/auth/facebook/callback"
Ważne: Nigdy nie commituj pliku
.envdo kontroli wersji. Użyj.env.exampledo udostępniania struktury konfiguracji.
2. Aktualizacja konfiguracji usług
Edytuj config/services.php:
<?php
return [
// ... istniejące usługi ...
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('GOOGLE_REDIRECT_URI'),
],
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => env('FACEBOOK_REDIRECT_URI'),
],
];
Migracja bazy danych
Utwórz migrację aby dodać kolumny logowania społecznościowego:
php artisan make:migration add_social_login_columns_to_users_table --table=users
Edytuj plik migracji:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('google_id')->nullable()->after('id');
$table->string('facebook_id')->nullable()->after('google_id');
$table->text('google_token')->nullable();
$table->text('facebook_token')->nullable();
$table->text('google_refresh_token')->nullable();
$table->text('facebook_refresh_token')->nullable();
$table->timestamp('email_verified_at')->nullable()->change(); // Uczyń weryfikację email opcjonalną dla logowania społecznościowego
$table->string('avatar')->nullable(); // Przechowuj URL obrazu profilowego
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn([
'google_id',
'facebook_id',
'google_token',
'facebook_token',
'google_refresh_token',
'facebook_refresh_token',
'avatar',
]);
});
}
};
Uruchom migrację:
php artisan migrate
Tworzenie kontrolera logowania społecznościowego
Wygeneruj kontroler:
php artisan make:controller Auth/SocialLoginController
Zaimplementuj kontroler z rozszerzoną obsługą błędów i logowaniem:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Laravel\Socialite\Facades\Socialite;
use Laravel\Socialite\Two\User as SocialiteUser;
use Exception;
class SocialLoginController extends Controller
{
public function redirectToGoogle(): RedirectResponse
{
return Socialite::driver('google')
->scopes(['email', 'profile'])
->redirect();
}
public function handleGoogleCallback(): RedirectResponse
{
try {
/** @var SocialiteUser $googleUser */
$googleUser = Socialite::driver('google')->user();
// Waliduj wymagane dane
if (!$googleUser->getEmail()) {
Log::warning('Uwierzytelnianie Google: Nie podano emaila');
return redirect()->route('login')
->with('error', 'Adres email jest wymagany do rejestracji.');
}
$user = $this->findOrCreateUser($googleUser, 'google');
Auth::login($user, true); // Zapamiętaj użytkownika
Log::info('Użytkownik zalogował się przez Google', ['user_id' => $user->id]);
return redirect()->intended(route('dashboard', absolute: false));
} catch (Exception $e) {
Log::error('Uwierzytelnianie Google nie powiodło się', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return redirect()->route('login')
->with('error', 'Uwierzytelnianie Google nie powiodło się. Spróbuj ponownie.');
}
}
public function redirectToFacebook(): RedirectResponse
{
return Socialite::driver('facebook')
->scopes(['email'])
->redirect();
}
public function handleFacebookCallback(): RedirectResponse
{
try {
/** @var SocialiteUser $facebookUser */
$facebookUser = Socialite::driver('facebook')->user();
// Waliduj wymagane dane
if (!$facebookUser->getEmail()) {
Log::warning('Uwierzytelnianie Facebook: Nie podano emaila');
return redirect()->route('login')
->with('error', 'Adres email jest wymagany do rejestracji.');
}
$user = $this->findOrCreateUser($facebookUser, 'facebook');
Auth::login($user, true); // Zapamiętaj użytkownika
Log::info('Użytkownik zalogował się przez Facebook', ['user_id' => $user->id]);
return redirect()->intended(route('dashboard', absolute: false));
} catch (Exception $e) {
Log::error('Uwierzytelnianie Facebook nie powiodło się', [
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return redirect()->route('login')
->with('error', 'Uwierzytelnianie Facebook nie powiodło się. Spróbuj ponownie.');
}
}
/**
* Znajdź lub utwórz użytkownika na podstawie danych dostawcy społecznościowego
*/
private function findOrCreateUser(SocialiteUser $socialUser, string $provider): User
{
// Sprawdź czy użytkownik istnieje przez ID dostawcy społecznościowego
$user = User::where($provider . '_id', $socialUser->getId())->first();
if ($user) {
// Aktualizuj tokeny i dane profilowe
$user->update([
$provider . '_token' => $socialUser->token,
$provider . '_refresh_token' => $socialUser->refreshToken,
'avatar' => $socialUser->getAvatar(),
]);
return $user;
}
// Sprawdź czy użytkownik istnieje przez email
$user = User::where('email', $socialUser->getEmail())->first();
if ($user) {
// Połącz konto społecznościowe z istniejącym użytkownikiem
$user->update([
$provider . '_id' => $socialUser->getId(),
$provider . '_token' => $socialUser->token,
$provider . '_refresh_token' => $socialUser->refreshToken,
'avatar' => $user->avatar ?: $socialUser->getAvatar(),
]);
return $user;
}
// Utwórz nowego użytkownika
return User::create([
'name' => $socialUser->getName(),
'email' => $socialUser->getEmail(),
'avatar' => $socialUser->getAvatar(),
'email_verified_at' => now(), // Konta społecznościowe są wcześniej zweryfikowane
$provider . '_id' => $socialUser->getId(),
$provider . '_token' => $socialUser->token,
$provider . '_refresh_token' => $socialUser->refreshToken,
]);
}
}
Obsługa tworzenia użytkowników
Ponieważ Laravel wymaga hasła do tworzenia użytkowników, musimy wygenerować losowe hasło dla użytkowników logowania społecznościowego. Użyjemy obserwatora do automatycznej obsługi tego.
1. Tworzenie UserObserver
php artisan make:observer UserObserver --model=User
2. Aktualizacja modelu User
Dodaj atrybut ObservedBy i pola fillable:
<?php
namespace App\Models;
use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
#[ObservedBy(UserObserver::class)]
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
protected $fillable = [
'name',
'email',
'password',
'google_id',
'facebook_id',
'google_token',
'facebook_token',
'google_refresh_token',
'facebook_refresh_token',
'avatar',
'email_verified_at',
];
protected $hidden = [
'password',
'remember_token',
'google_token',
'facebook_token',
'google_refresh_token',
'facebook_refresh_token',
];
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
/**
* Sprawdź czy użytkownik zarejestrował się przez logowanie społecznościowe
*/
public function isSocialUser(): bool
{
return !empty($this->google_id) || !empty($this->facebook_id);
}
/**
* Pobierz obraz profilowy użytkownika
*/
public function getProfileImageAttribute(): string
{
if ($this->avatar) {
return $this->avatar;
}
// Fallback do Gravatar
return 'https://www.gravatar.com/avatar/' . md5(strtolower($this->email)) . '?d=mp&s=150';
}
}
3. Implementacja UserObserver
<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Str;
class UserObserver
{
public function creating(User $user): void
{
// Wygeneruj losowe hasło dla użytkowników logowania społecznościowego
if (!$user->password) {
$user->password = bcrypt(Str::random(32));
}
}
public function created(User $user): void
{
// Loguj tworzenie użytkownika
Log::info('Utworzono nowego użytkownika', [
'user_id' => $user->id,
'email' => $user->email,
'social_login' => $user->isSocialUser(),
]);
}
}
Dodawanie tras
Dodaj te trasy do routes/auth.php:
<?php
use App\Http\Controllers\Auth\SocialLoginController;
// ... inne importy
Route::middleware('guest')->group(function (): void {
// ... istniejące trasy ...
// Trasy logowania społecznościowego
Route::prefix('auth')->name('auth.')->group(function () {
// Google OAuth
Route::get('google', [SocialLoginController::class, 'redirectToGoogle'])
->name('google');
Route::get('google/callback', [SocialLoginController::class, 'handleGoogleCallback'])
->name('google.callback');
// Facebook OAuth
Route::get('facebook', [SocialLoginController::class, 'redirectToFacebook'])
->name('facebook');
Route::get('facebook/callback', [SocialLoginController::class, 'handleFacebookCallback'])
->name('facebook.callback');
});
});
Implementacja frontendu
Rozszerzony komponent React/TypeScript z lepszym UX:
import { Head, Link, useForm } from '@inertiajs/react';
import { Button } from '@/Components/ui/button';
import { LoaderCircle } from 'lucide-react';
import { FormEventHandler, useState } from 'react';
interface LoginProps {
status?: string;
canResetPassword: boolean;
}
export default function Login({ status, canResetPassword }: LoginProps) {
const [isLoading, setIsLoading] = useState<string | null>(null);
const { data, setData, post, processing, errors, reset } = useForm({
email: '',
password: '',
remember: false,
});
const submit: FormEventHandler = (e) => {
e.preventDefault();
post(route('login'), {
onFinish: () => reset('password'),
});
};
const handleSocialLogin = (provider: 'google' | 'facebook') => {
setIsLoading(provider);
window.location.href = route(`auth.${provider}`);
};
return (
<AuthLayout
title="Zaloguj się do swojego konta"
description="Wprowadź swój email i hasło poniżej lub użyj logowania społecznościowego"
>
<Head title="Zaloguj się" />
<div className="flex flex-col gap-6">
{/* Przyciski logowania społecznościowego */}
<div className="grid grid-cols-2 gap-4">
<Button
variant="outline"
type="button"
onClick={() => handleSocialLogin('google')}
disabled={isLoading !== null}
className="w-full"
>
{isLoading === 'google' ? (
<LoaderCircle className="mr-2 h-4 w-4 animate-spin" />
) : (
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24">
<path
fill="#4285F4"
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"
/>
<path
fill="#34A853"
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
/>
<path
fill="#FBBC05"
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
/>
<path
fill="#EA4335"
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
/>
</svg>
)}
Kontynuuj z Google
</Button>
<Button
variant="outline"
type="button"
onClick={() => handleSocialLogin('facebook')}
disabled={isLoading !== null}
className="w-full"
>
{isLoading === 'facebook' ? (
<LoaderCircle className="mr-2 h-4 w-4 animate-spin" />
) : (
<svg className="mr-2 h-4 w-4" viewBox="0 0 24 24" fill="#1877F2">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
</svg>
)}
Kontynuuj z Facebook
</Button>
</div>
<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t" />
</div>
<div className="relative flex justify-center text-xs uppercase">
<span className="bg-background px-2 text-muted-foreground">
Lub kontynuuj z emailem
</span>
</div>
</div>
{/* Regularny formularz logowania */}
<form onSubmit={submit} className="space-y-4">
{/* Twoje istniejące pola formularza tutaj */}
</form>
</div>
</AuthLayout>
);
}
Testowanie implementacji
1. Testowanie lokalnego rozwoju
Przetestuj swoją implementację tymi krokami:
# Wyczyść cache
php artisan config:clear
php artisan cache:clear
php artisan route:clear
# Uruchom serwer deweloperski
php artisan serve
# Lub z Docker
docker compose up -d
2. Weryfikacja konfiguracji OAuth
Utwórz prostą trasę testową aby zweryfikować konfigurację:
// routes/web.php (tymczasowe - usuń po testowaniu)
Route::get('/test-oauth', function () {
return response()->json([
'google_configured' => config('services.google.client_id') !== null,
'facebook_configured' => config('services.facebook.client_id') !== null,
'app_url' => config('app.url'),
]);
})->middleware('web');
3. Testowanie obu dostawców
-
Test logowania Google:
- Kliknij "Kontynuuj z Google"
- Autoryzuj swoją aplikację
- Zweryfikuj udane logowanie i tworzenie użytkownika
-
Test logowania Facebook:
- Kliknij "Kontynuuj z Facebook"
- Autoryzuj swoją aplikację
- Zweryfikuj udane logowanie i tworzenie użytkownika
-
Test obsługi błędów:
- Spróbuj uzyskać dostęp do URL-i callback bezpośrednio
- Przetestuj z odmówionymi uprawnieniami
- Zweryfikuj odpowiednie komunikaty błędów
Typowe problemy i rozwiązania
1. Nieprawidłowy URI przekierowania
Problem: Błąd "redirect_uri_mismatch"
Rozwiązania:
- Upewnij się, że URI przekierowania w
.envdokładnie pasuje do konfiguracji konsoli OAuth - Usuń końcowe ukośniki i dodatkowe spacje
- Dla Docker: użyj
http://localhost(bez numeru portu) - Wyczyść cache Laravel:
php artisan config:clear
2. Wymaganie HTTPS Facebook
Problem: Facebook wymaga HTTPS w produkcji
Rozwiązania:
- Włącz "Development Mode" dla lokalnego testowania
- Użyj ngrok dla tunelu HTTPS podczas rozwoju:
ngrok http 80 - Zapewnij certyfikat SSL w produkcji
3. Problemy z ekranem zgody Google
Problem: Ostrzeżenie "Ta aplikacja nie jest zweryfikowana"
Rozwiązania:
- Dla testowania: Użyj typu użytkownika "External" z użytkownikami testowymi
- Dodaj użytkowników testowych w Google Cloud Console
- Dla produkcji: Ukończ proces weryfikacji aplikacji
- Użyj typu "Internal" dla aplikacji tylko dla organizacji
4. Email nie został podany
Problem: Dostawca społecznościowy nie zwraca emaila
Rozwiązania:
- Zażądaj zakresu email jawnie
- Sprawdź ustawienia prywatności użytkownika
- Zaimplementuj fallback zbierania emaila
- Zweryfikuj email przed utworzeniem użytkownika
5. Przechowywanie tokenów i bezpieczeństwo
Problem: Przechowywanie wrażliwych tokenów OAuth
Rozwiązania:
- Zaszyfruj kolumny tokenów w bazie danych
- Zaimplementuj logikę odświeżania tokenów
- Użyj kluczy szyfrowania specyficznych dla środowiska
- Regularne czyszczenie tokenów dla wygasłych tokenów
6. Problemy z migracją bazy danych
Problem: Migracja nie powodzi się lub konflikty
Rozwiązania:
# Sprawdź status migracji
php artisan migrate:status
# Cofnij konkretną migrację
php artisan migrate:rollback --step=1
# Świeża migracja (ostrożnie: utrata danych)
php artisan migrate:fresh
Rozważania bezpieczeństwa
1. Walidacja i sanitizacja danych
// W twoim kontrolerze
private function validateSocialUser(SocialiteUser $user): void
{
if (!filter_var($user->getEmail(), FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Nieprawidłowy adres email');
}
if (strlen($user->getName()) > 255) {
throw new InvalidArgumentException('Nazwa za długa');
}
}
2. Ograniczanie liczby żądań
Dodaj ograniczanie liczby żądań aby zapobiec nadużyciom:
// W routes/auth.php
Route::middleware(['throttle:auth'])->group(function () {
Route::get('auth/google', [SocialLoginController::class, 'redirectToGoogle']);
// ... inne trasy
});
3. Ochrona CSRF
Upewnij się, że tokeny CSRF są prawidłowo obsługiwane:
// W twoim komponencie frontendu
<meta name="csrf-token" content="{{ csrf_token() }}" />
4. Bezpieczne przechowywanie tokenów
Rozważ zaszyfrowanie tokenów społecznościowych:
// W twoim modelu User
protected $casts = [
'google_token' => 'encrypted',
'facebook_token' => 'encrypted',
'google_refresh_token' => 'encrypted',
'facebook_refresh_token' => 'encrypted',
];
5. Bezpieczeństwo środowiska
- Użyj silnego, unikalnego
APP_KEY - Przechowuj poświadczenia OAuth w zmiennych środowiskowych
- Użyj różnych poświadczeń dla staging/produkcji
- Regularnie rotuj sekrety OAuth
- Włącz 2FA dla kont konsoli OAuth
Podsumowanie
Implementacja logowania społecznościowego w Laravel używając Socialite znacząco poprawia doświadczenie użytkownika przy zachowaniu bezpieczeństwa. Ten kompleksowy przewodnik obejmował:
- ✅ Kompletną konfigurację OAuth dla Google i Facebook
- ✅ Bezpieczną implementację z prawidłową obsługą błędów
- ✅ Projekt bazy danych dla uwierzytelniania społecznościowego
- ✅ Integrację frontendu z nowoczesnym UX
- ✅ Rozważania bezpieczeństwa gotowe do produkcji
- ✅ Typowe rozwiązania problemów
Kluczowe wnioski
- Zawsze priorytet bezpieczeństwa: Waliduj dane, używaj HTTPS i chroń wrażliwe tokeny
- Planuj na błędy: Zaimplementuj kompleksową obsługę błędów i logowanie
- Testuj dokładnie: Zweryfikuj funkcjonalność w środowiskach deweloperskich i produkcyjnych
- Monitoruj aktywnie: Śledź metryki uwierzytelniania i zdarzenia bezpieczeństwa
- Bądź na bieżąco: Regularnie aktualizuj zależności i konfiguracje OAuth
Śledź mnie na LinkedIn aby uzyskać więcej wskazówek i najlepszych praktyk uwierzytelniania Laravel!
Masz pytania dotyczące implementacji logowania społecznościowego lub potrzebujesz pomocy w rozwiązywaniu problemów? Zostaw komentarz poniżej, a pomogę Ci!