Laravel makes API authentication a breeze using Laravel Passport, which provides a full OAuth2 server implementation for your Laravel application in a matter of minutes.
If you are new to Laravel, I suggest you go through this article first to learn how to set up and create a new project.
Once you have a project, you can continue below.
Step 1
Install Passport
In your laravel project, run the command
composer require laravel/passport
and then run migrate command to create all the necessary tables.
php artisan migrate
Finally, install it
php artisan passport:install
This command will create the encryption keys needed to generate secure access tokens.
Step 2
Configure Project
We will make changes in the following 3 files:
1. app/User.php
Add the following line at the top
use Laravel\Passport\HasApiTokens;
And inside the class add this usage of HasApiTokens;
The user class should now look like this
<?php namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, Notifiable; ...//more code }
2. app/Providers/AuthServiceProvider.php
Here we need to add Passport routes in the boot() function. Make the following changes which are in bold.
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use Laravel\Passport\Passport; class AuthServiceProvider extends ServiceProvider { ... //more code public function boot() { $this->registerPolicies(); Passport::routes(); } }
This method will register the routes necessary to issue access tokens and revoke access tokens, clients, and personal access tokens.
3. config/auth.php
Here, set the driver option of the api authentication guard to passport.
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', 'hash' => false, ], ],
Step 3
The controller
Now we will make the controller for handling the logic of the authentication routes. Run the following command to create a controller, We shall create this inside a new namespace for the Api, so that all your API controllers can be separate for cleaner architecture.
php artisan make:controller Api/AuthController
Go to the newly created file in app/Http/Controllers/Api/AuthController.php
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Carbon\Carbon; use App\User; class AuthController extends Controller { }
Add the methods for login, register, logout and one for getting the user detail
public function register(Request $request) { $validatedData = $request->validate([ 'name' => 'required|max:55', 'role' => 'required|max:55', 'email' => 'email|required|unique:users', 'password' => 'required|confirmed' ]); $validatedData['password'] = bcrypt($request->password); $user = User::create($validatedData); $accessToken = $user->createToken('authToken')->accessToken; return response([ 'user' => $user, 'access_token' => $accessToken]); } public function login(Request $request) { $loginData = $request->validate([ 'email' => 'email|required', 'password' => 'required' ]); if (!auth()->attempt($loginData)) { return response(['message' => 'Invalid Credentials']); } $accessToken = auth()->user()->createToken('authToken')->accessToken; return response(['user' => auth()->user(), 'access_token' => $accessToken]); } public function logout(Request $request) { $request->user()->token()->revoke(); return response()->json([ 'message' => 'Successfully logged out' ]); } public function user(Request $request) {. return response()->json($request->user()); }
Step 4
The routes
Now the last step is to configure the routes for accessing the api functions.
Go to routes/api.php file and add the following routes, for each of the functions we wrote in our controller.
Route::post('/register', 'Api\AuthController@register'); Route::post('/login', 'Api\AuthController@login'); Route::post('/logout', 'Api\AuthController@logout');
Now you are ready to test your api!
Test
Open Postman and test the endpoints.
POST http://localhost:8000/api/login
Similarly, you can pass the parameters for the register endpoint and test it.
…
Leave A Comment