Practical Tutorial: Securing Laravel APIs with OAuth2 and JWT

Securing APIs is crucial for protecting sensitive data and ensuring only authorized users can access your resources. Laravel, one of the most popular PHP frameworks, offers robust tools to implement OAuth2 and JWT (JSON Web Tokens) for secure API authentication. This tutorial provides a step-by-step guide to securing your Laravel APIs using OAuth2 and JWT.

Prerequisites

  • Laravel 8 or higher installed
  • Composer installed on your system
  • Basic understanding of Laravel framework
  • Knowledge of API authentication concepts

Installing Necessary Packages

To implement OAuth2 and JWT, we’ll use the Laravel Passport package, which provides a full OAuth2 server implementation.

Run the following command to install Laravel Passport:

composer require laravel/passport

Setting Up Laravel Passport

After installing, run the migration command to create the necessary tables:

php artisan migrate

Next, install Passport’s encryption keys:

php artisan passport:install

Finally, in your AuthServiceProvider, add the following to the boot method:

use Laravel\Passport\Passport;

public function boot() { $this->registerPolicies(); Passport::routes(); }

And, in your config/auth.php, set the driver to passport for API authentication:

'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],

Configuring JWT Authentication

While Passport handles OAuth2 tokens, you might also want to implement JWT for stateless authentication. To do this, install the tymon/jwt-auth package:

composer require tymon/jwt-auth

Publish the config file:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

Generate the secret key:

php artisan jwt:secret

Configure the config/jwt.php as needed, and update your auth.php guard to use JWT:

'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],

Protecting Your API Routes

Now, you can secure your API routes by applying the auth:api middleware. For example:

Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); });

Testing Your Secured API

Use tools like Postman or cURL to test your secured endpoints. Obtain a token via OAuth2 or JWT login, then include it in your request headers:

Authorization: Bearer YOUR_ACCESS_TOKEN

Conclusion

Implementing OAuth2 with Laravel Passport and JWT provides a secure way to authenticate API requests. Properly securing your APIs ensures data privacy and integrity, which is essential for modern web applications.