Tworzenie bezpiecznego interfejsu API Laravel z uwierzytelnianiem JWT
Podczas tworzenia interfejsów API za pomocą Laravel, zapewnienie bezpiecznego uwierzytelniania ma kluczowe znaczenie, zwłaszcza gdy mamy do czynienia z danymi użytkownika. JSON Web Tokens (JWT) oferują solidną metodę obsługi uwierzytelniania w aplikacjach bezstanowych, umożliwiając bezpieczną transmisję informacji o użytkowniku między stronami. Ten przewodnik przeprowadzi Cię przez proces tworzenia bezpiecznego interfejsu API Laravel przy użyciu uwierzytelniania JWT.
Wymagania wstępne
- Podstawowa znajomość PHP i Laravel.
- Laravel zainstalowany na komputerze (najlepiej Laravel 9 lub nowszy).
- Zainstalowany Composer.
- MySQL lub inna baza danych skonfigurowana dla aplikacji.
Krok 1: Utwórz nowy projekt Laravel
Najpierw utwórz nowy projekt Laravel za pomocą Composera:
composer create-project laravel/laravel laravel-jwt-api
Przejdź do katalogu projektu:
cd laravel-jwt-api
Krok 2: Instalacja pakietu uwierzytelniania JWT
Najczęściej używanym pakietem do uwierzytelniania JWT w Laravel jest tymon/jwt-auth. Zainstaluj go za pomocą Composera:
composer require tymon/jwt-auth
Po instalacji pakietu opublikuj konfigurację JWT:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Spowoduje to utworzenie pliku config/jwt. php w projekcie.
Krok 3: Generowanie tajnego klucza JWT
Wygeneruj tajny klucz, którego JWT będzie używać do podpisywania tokenów:
php artisan jwt:secret
Spowoduje to dodanie wpisu JWT_SECRET do pliku .env, który jest używany do kodowania i dekodowania tokenów.
Krok 4: Konfiguracja uwierzytelniania
Aby skonfigurować uwierzytelnianie JWT, należy skonfigurować domyślnego strażnika dla interfejsu API. Zaktualizuj plik config/auth. php w następujący sposób:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
Krok 5: Utwórz model użytkownika i migrację
Jeśli model użytkownika nie został jeszcze utworzony, można go utworzyć wraz z plikiem migracji:
php artisan make:model User -m
Otwórz wygenerowany plik migracji w database/migrations/ i dodaj niezbędne pola, takie jak imię i nazwisko, adres e-mail i hasło:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
Uruchom migrację, aby utworzyć tabelę użytkowników:
php artisan migrate
Krok 6: Wdrożenie metod JWT w modelu użytkownika
W modelu użytkownika(app/Models/User.php) zaimplementuj interfejs JWTSubject i wymagane metody:
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
public function getJWTIdentifier()
{
return $this->getKey(); // Zwykle klucz główny (id)
}
public function getJWTCustomClaims()
{
return [];
}
}
Krok 7: Tworzenie kontrolerów uwierzytelniania
Utwórz kontroler do obsługi uwierzytelniania użytkowników:
php artisan make:controller AuthController
W pliku AuthController.php dodaj metody rejestracji użytkownika, logowania i wylogowywania:
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'hasło' => Hash::make($request->password),
]);
$token = JWTAuth::fromUser($user);
return response()->json(['token' => $token], 201);
}
// Logowanie użytkownika
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (!$token = Auth::attempt($credentials)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
return response()->json(['token' => $token]);
}
// Wylogowanie użytkownika (Nieprawidłowy token)
public function logout()
{
Auth::logout();
return response()->json(['message' => 'Pomyślnie wylogowano']);
}
// Pobierz uwierzytelnionego użytkownika
public function me()
{
return response()->json(Auth::user());
}
}
Krok 8: Definiowanie tras API
Dodaj trasy uwierzytelniania w pliku routes/api.php:
use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
// Chronione trasy (wymagają tokena JWT)
Route::middleware('auth:api')->group(function () {
Route::post('logout', [AuthController::class, 'logout']);
Route::get('me', [AuthController::class, 'me']);
});
Te trasy obsługują rejestrację użytkownika, logowanie, wylogowanie i pobieranie uwierzytelnionego użytkownika.
Krok 9: Ochrona tras API
Aby chronić inne trasy API, można użyć oprogramowania pośredniczącego auth:api. Na przykład, jeśli masz trasę zasobów dla postów:
Route::middleware('auth:api')->group(function () {
Route::resource('posts', PostController::class);
});
Zapewnia to, że tylko uwierzytelnieni użytkownicy mogą uzyskać dostęp do tych tras.
Krok 10: Testowanie API
Możesz przetestować swój interfejs API za pomocą narzędzi takich jak Postman lub cURL.
- Zarejestruj użytkownika:
POST /api/register
Host: your-domain.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com",
"password": "password",
"password_confirmation": "password"
} - Zaloguj się:
POST /api/login
Host: your-domain.com
Content-Type: application/json
{
"email": "john@example.com",
"password": "password"
}Zwróci to token, którego można użyć do uwierzytelnienia innych żądań. - Dostęp do chronionej trasy: Aby uzyskać dostęp do chronionej trasy, takiej jak GET /api/me, należy dołączyć token w nagłówku Authorization:
Authorization: Bearer
Krok 11: Odświeżanie tokenów JWT (opcjonalnie)
Aby odświeżyć token, możesz dodać metodę w AuthController:
public function refresh()
{
$token = Auth::refresh();
return response()->json(['token' => $token]);
}
Dodaj trasę odświeżania:
Route::post('refresh', [AuthController::class, 'refresh'])->middleware('auth:api');
Wnioski
Postępując zgodnie z tym przewodnikiem, zbudowałeś bezpieczny interfejs API Laravel z uwierzytelnianiem JWT, umożliwiając rejestrację użytkowników, logowanie i dostęp do chronionych tras. JWT pozwala na utrzymanie bezstanowego mechanizmu uwierzytelniania, co jest szczególnie przydatne przy skalowaniu API. Dzięki tej konfiguracji można jeszcze bardziej dostosować logikę uwierzytelniania aplikacji i zintegrować dodatkowe funkcje, takie jak kontrola dostępu oparta na rolach i tokeny odświeżania dla długotrwałych sesji.