Create API Rest with Laravel 7 Passport Authentication (Part 1)
By: Alfredo Barron
Tags: Authentication, API, Rest Api, PHP, Laravel

Step 1. Install Laravel

In first step, we require to get fresh Laravel application using bellow command, So open your terminal or command prompt and run bellow command:

laravel new auth

Step 2. Install Laravel Passport Package

Laravel Passport provides a full OAuth2 server implementation for your Laravel application in a matter of minutes.

composer require laravel/passport

Step 3. Run migration

The Passport migrations will create the tables your application needs to store clients and access tokens, before this you should have already created and configured the connection to your database.

php artisan migrate

Step 4. Generate keys

This command will create the encryption keys needed to generate secure access tokens. In addition, the command will create “personal access” and “password grant” clients which will be used to generate access tokens:

php artisan passport:install

Step 5. Passport config

Add the Laravel\Passport\HasApiTokens trait to your App\User model. This trait will provide a few helper methods to your model which allow you to inspect the authenticated user's token and scopes:

<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Passport\HasApiTokens; class User extends Authenticatable

{

use HasApiTokens, Notifiable;

}

Next, you should call the Passport::routes method within the boot method of your AuthServiceProvider . This method will register the routes necessary to issue access tokens and revoke access tokens, clients, and personal access tokens:

<?php namespace App\Providers;



use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

use Illuminate\Support\Facades\Gate;

use Laravel\Passport\Passport;

{

/**

* The policy mappings for the application.

*

*

*/

protected $policies = [

'App\Model' => 'App\Policies\ModelPolicy',

]; class AuthServiceProvider extends ServiceProvider/*** The policy mappings for the application. @var array*/protected $policies = ['App\Model' => 'App\Policies\ModelPolicy',];

* Register any authentication / authorization services.

*

*

*/

public function boot()

{

$this->registerPolicies(); /*** Register any authentication / authorization services. @return void*/public function boot()$this->registerPolicies(); Passport::routes();

}

}

Finally, in your config/auth.php configuration file, you should set the driver option of the api authentication guard to passport . This will instruct your application to use Passport's TokenGuard when authenticating incoming API requests:

'guards' => [

'web' => [

'driver' => 'session',

'provider' => 'users',

],

'api' => [

'driver' => 'passport',

'provider' => 'users',

],

],

Step 6. Create API Routes

We will create api routes. Laravel provide routes/api.php file for write web services route. So, let’s add new route on that file.

<?php use Illuminate\Http\Request; Route::group([

'prefix' => 'auth'

], function () {

Route::post('login', 'AuthController@login');

Route::post('signup', 'AuthController@signup');



Route::group([

'middleware' => 'auth:api'

], function() {

Route::get('logout', 'AuthController@logout');

Route::get('user', 'AuthController@user');

});

});

Step 7: Create Controller

In last step we have to create new controller and four api method. So let’s create AuthController

php artisan make:controller AuthController

Into controller file put bellow code:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

use Carbon\Carbon;

use App\User;

{

/**

* Create user

*

*

*

*

*

*

*/

public function signup(Request $request)

{

$request->validate([

'name' => 'required|string',

'email' => 'required|string|email|unique:users',

'password' => 'required|string|confirmed'

]); class AuthController extends Controller/*** Create user @param [string] name @param [string] email @param [string] password @param [string] password_confirmation @return [string] message*/public function signup(Request $request)$request->validate(['name' => 'required|string','email' => 'required|string|email|unique:users','password' => 'required|string|confirmed']); $user = new User([

'name' => $request->name,

'email' => $request->email,

'password' => bcrypt($request->password)

]); $user->save();

'message' => 'Successfully created user!'

], 201);

}



/**

* Login user and create token

*

*

*

*

*

*

*

*/

public function login(Request $request)

{

$request->validate([

'email' => 'required|string|email',

'password' => 'required|string',

'remember_me' => 'boolean'

]); return response()->json(['message' => 'Successfully created user!'], 201);/*** Login user and create token @param [string] email @param [string] password @param [boolean] remember_me @return [string] access_token @return [string] token_type @return [string] expires_at*/public function login(Request $request)$request->validate(['email' => 'required|string|email','password' => 'required|string','remember_me' => 'boolean']); $credentials = request(['email', 'password']); if(!Auth::attempt($credentials))

return response()->json([

'message' => 'Unauthorized'

], 401); $user = $request->user(); $tokenResult = $user->createToken('Personal Access Token');

$token = $tokenResult->token; if ($request->remember_me)

$token->expires_at = Carbon::now()->addWeeks(1); $token->save();

'access_token' => $tokenResult->accessToken,

'token_type' => 'Bearer',

'expires_at' => Carbon::parse(

$tokenResult->token->expires_at

)->toDateTimeString()

]);

}



/**

* Logout user (Revoke the token)

*

*

*/

public function logout(Request $request)

{

$request->user()->token()->revoke(); return response()->json(['access_token' => $tokenResult->accessToken,'token_type' => 'Bearer','expires_at' => Carbon::parse($tokenResult->token->expires_at)->toDateTimeString()]);/*** Logout user (Revoke the token) @return [string] message*/public function logout(Request $request)$request->user()->token()->revoke();

'message' => 'Successfully logged out'

]);

}



/**

* Get the authenticated User

*

*

*/

public function user(Request $request)

{

return response()->json($request->user());

}

} return response()->json(['message' => 'Successfully logged out']);/*** Get the authenticated User @return [json] user object*/public function user(Request $request)return response()->json($request->user());

Now we are ready to run our example so run bellow command to quick run: