While solutions like
tymondesigns/jwt-auth(Laravel) orLexikJWTAuthenticationBundle(Symfony) are popular, we recommend adopting open standards such as OpenID Connect (OIDC) for robust, scalable, and interoperable authentication.
For comprehensive details on authentication, refer to our Laravel Authentication documentation.
Install
Follow the official installation guide of
Laravel Passport to implement OpenID Connect
(OIDC) standards in your Laravel application. Alternatively, if you prefer an ad-hoc solution,
you can use tymondesigns/jwt-auth to set up JWT
authentication in your Laravel project.
Configure Authentication
Refer to the Authentication section of our documentation to
properly configure and secure your API with JWT tokens.
Use Laravel middlewares with API Platform such as
auth:apito restrict access to certain endpoints, ensuring only authenticated users can access them.
By following these steps, you can set up a secure and scalable JWT-based authentication system in your Laravel application.
To verify your authentication setup using ApiTestCase, you can write a test method tailored to
your preferred testing framework. Here’s how you can approach it for both Pest and PHPUnit:
Ensure your routes (/api/auth) and authentication mechanisms are configured to match your
application’s implementation.
<?php
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
it('authenticates a user and tests protected endpoints', function () {
// Create a user
$user = User::factory()->create([
'email' => 'test@example.com',
'password' => bcrypt('$3CR3T'), // Hash the password
]);
// Retrieve a token
$response = $this->postJson('/api/auth', [
'email' => 'test@example.com',
'password' => '$3CR3T',
]);
$response->assertStatus(200)
->assertJsonStructure(['token']);
$token = $response->json('token');
// Test not authorized
$this->getJson('/api/greetings')
->assertStatus(401);
// Test authorized
$this->withHeader('Authorization', "Bearer $token")
->getJson('/api/greetings')
->assertStatus(200);
});<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AuthenticationTest extends TestCase
{
use RefreshDatabase;
public function testLogin(): void
{
$user = User::factory()->create([
'email' => 'test@example.com',
'password' => bcrypt('$3CR3T'), // Hash the password
]);
// Retrieve a token
$response = $this->postJson('/api/auth', [
'email' => 'test@example.com',
'password' => '$3CR3T',
]);
$response->assertStatus(200)
->assertJsonStructure(['token']);
$token = $response->json('token');
// Test not authorized
$this->getJson('/api/greetings')
->assertStatus(401);
// Test authorized
$this->withHeader('Authorization', "Bearer $token")
->getJson('/api/greetings')
->assertStatus(200);
}
}You can also help us improve the documentation of this page.
Made with love by
Les-Tilleuls.coop can help you design and develop your APIs and web projects, and train your teams in API Platform, Symfony, Next.js, Kubernetes and a wide range of other technologies.
Learn more