Laravel 9 Sanctum API Authentication Example

10-Apr-2023

.

Admin

Laravel 9 Sanctum API Authentication Example

Hi Guys,

Today,I will learn you how to use sanctum api authentication laravel 9. We will show an example of sanctum api authentication in laravel 9. it's a simple example of laravel 9 sanctum example. you'll learn laravel 9 sanctum rest api example. So, let's follow a few step to create an example of laravel 9 sanctum api token tutorial.

Laravel 9 Sanctum provides a simple authentication system for SPAs (single page applications), mobile applications, and simple, token based APIs. Sanctum also allows each user of your application to generate multiple API tokens for their account.

You also want to create api for your mobile application then you can follow this tutorial for how to create the rest api step by step with laravel 9 and sanctum. If you are new then don't worry about the written tutorial step by step.

Step 1: Download Laravel


Let us begin the tutorial by installing a new laravel application. if you have already created the project, then skip following step.

composer create-project laravel/laravel example-app

Step 2 : Database Configuration

In second step, we will make database Configuration for example database name, username, password etc. So lets open .env file and fill all deatils like as bellow:

.env

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=here your database name(blog)

DB_USERNAME=here database username(root)

DB_PASSWORD=here database password(root)

Step 3: Install Laravel Sanctum

In this step we need to install sanctum via the Composer package manager, so one your terminal and fire bellow command.

composer require laravel/sanctum

After successfully install package, we need to publish configuration file with following command:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

we require to get default migration for create new sanctum tables in our database. so let's run bellow command.

php artisan migrate

Next, we need to add middleware for sanctum api, so let's add as like bellow:

app/Http/Kernel.php

....

'api' => [

\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

'throttle:api',

\Illuminate\Routing\Middleware\SubstituteBindings::class,

],

....

Step 4: Sanctum Configuration

In this step, we have to configuration on three place model, service provider, and auth config file. So you have to just following the change on that file.

In the model, we added HasApiTokens class of Sanctum,

In auth.php, we added api auth configuration.

app/Models/User.php

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable

{

use HasFactory, Notifiable, HasApiTokens;

/**

* The attributes that are mass assignable.

*

* @var array

*/

protected $fillable = [

'name',

'email',

'password',

];

/**

* The attributes that should be hidden for arrays.

*

* @var array

*/

protected $hidden = [

'password',

'remember_token',

];

/**

* The attributes that should be cast to native types.

*

* @var array

*/

protected $casts = [

'email_verified_at' => 'datetime',

];

}

Step 5: Add Food Table and Model

In this step, We required to create migration for posts table using Laravel 9 php artisan command, so first fire bellow command.

php artisan make:model Foods -m

After this command, you will find one file in the following path database/migrations and you have to put bellow code in your migration file for create a Foods table.

database/migrations/create_foods_table.php

<?php

use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;

class CreateFoodsTable extends Migration

{

/**

* Run the migrations.

*

* @return void

*/

public function up()

{

Schema::create('foods', function (Blueprint $table) {

$table->id();

$table->string('name');

$table->text('detail');

$table->timestamps();

});

}

/**

* Reverse the migrations.

*

* @return void

*/

public function down()

{

Schema::dropIfExists('foods');

}

}

After create migration we need to run above migration by following command:

php artisan migrate

After create the "foods" table you should create a Food model for foods, so first, create a file in this path app/Models/Food.php and put bellow content in the item.php file.

app/Models/Foods.php

app/Models/Foods.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class Foods extends Model

{

use HasFactory;

/**

* The attributes that are mass assignable.

*

* @var array

*/

protected $fillable = [

'name', 'detail'

];

}

Step 6: Add API Routes

routes/api.php

<?php

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\API\RegisterController;

use App\Http\Controllers\API\FoodController;

/*

|--------------------------------------------------------------------------

| API Routes

|--------------------------------------------------------------------------

|

| Here is where you can register API routes for your application. These

| routes are loaded by the RouteServiceProvider within a group which

| is assigned the "api" middleware group. Enjoy building your API!

|

*/

Route::post('register', [RegisterController::class, 'register']);

Route::post('login', [RegisterController::class, 'login']);

Route::middleware('auth:sanctum')->group( function () {

Route::resource('foods', FoodController::class);

});

Step 7: Add Controller

In this step, we have to create a new controller as BaseController, FoodController, and RegisterController, I created a new folder "API" in the Controllers folder because we will make alone APIs controller, So let's create both controller.

php artisan make:controller API/BaseController

app/Http/Controllers/API/BaseController.php

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

class BaseController extends Controller

{

/**

* success response method.

*

* @return \Illuminate\Http\Response

*/

public function sendResponse($result, $message)

{

$response = [

'success' => true,

'data' => $result,

'message' => $message,

];

return response()->json($response, 200);

}

/**

* return error response.

*

* @return \Illuminate\Http\Response

*/

public function sendError($error, $errorMessages = [], $code = 404)

{

$response = [

'success' => false,

'message' => $error,

];

if(!empty($errorMessages)){

$response['data'] = $errorMessages;

}

return response()->json($response, $code);

}

}

php artisan make:controller API/RegisterController

app/Http/Controllers/API/RegisterController.php

<?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\API\BaseController as BaseController;

use Illuminate\Http\Request;

use App\Models\User;

use Illuminate\Support\Facades\Auth;

use Validator;

class RegisterController extends BaseController

{

/**

* Register api

*

* @return \Illuminate\Http\Response

*/

public function register(Request $request)

{

$validator = Validator::make($request->all(), [

'name' => 'required',

'email' => 'required|email',

'password' => 'required',

'c_password' => 'required|same:password',

]);

if($validator->fails()){

return $this->sendError('Validation Error.', $validator->errors());

}

$input = $request->all();

$input['password'] = bcrypt($input['password']);

$user = User::create($input);

$success['token'] = $user->createToken('MyApp')->plainTextToken;

$success['name'] = $user->name;

return $this->sendResponse($success, 'User register successfully.');

}

/**

* Login api

*

* @return \Illuminate\Http\Response

*/

public function login(Request $request)

{

if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){

$user = Auth::user();

$success['token'] = $user->createToken('MyApp')->plainTextToken;

$success['name'] = $user->name;

return $this->sendResponse($success, 'User login successfully.');

}

else{

return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);

}

}

}

php artisan make:controller API/FoodController

app/Http/Controllers/API/FoodController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;

use App\Http\Controllers\API\BaseController as BaseController;

use App\Models\Food;

use Validator;

use App\Http\Resources\Food as FoodResource;

class FoodController extends BaseController

{

/**

* Display a listing of the resource.

*

* @return \Illuminate\Http\Response

*/

public function index()

{

$foods = Food::all();

return $this->sendResponse(FoodResource::collection($foods), 'Foods retrieved successfully.');

}

/**

* Store a newly created resource in storage.

*

* @param \Illuminate\Http\Request $request

* @return \Illuminate\Http\Response

*/

public function store(Request $request)

{

$input = $request->all();

$validator = Validator::make($input, [

'name' => 'required',

'detail' => 'required'

]);

if($validator->fails()){

return $this->sendError('Validation Error.', $validator->errors());

}

$food = Food::create($input);

return $this->sendResponse(new FoodResource($food), 'Food created successfully.');

}

/**

* Display the specified resource.

*

* @param int $id

* @return \Illuminate\Http\Response

*/

public function show($id)

{

$food = Food::find($id);

if (is_null($food)) {

return $this->sendError('Food not found.');

}

return $this->sendResponse(new FoodResource($food), 'Food retrieved successfully.');

}

/**

* Update the specified resource in storage.

*

* @param \Illuminate\Http\Request $request

* @param int $id

* @return \Illuminate\Http\Response

*/

public function update(Request $request, Food $food)

{

$input = $request->all();

$validator = Validator::make($input, [

'name' => 'required',

'detail' => 'required'

]);

if($validator->fails()){

return $this->sendError('Validation Error.', $validator->errors());

}

$food->name = $input['name'];

$food->detail = $input['detail'];

$food->save();

return $this->sendResponse(new FoodResource($food), 'Food updated successfully.');

}

/**

* Remove the specified resource from storage.

*

* @param int $id

* @return \Illuminate\Http\Response

*/

public function destroy(Food $food)

{

$food->delete();

return $this->sendResponse([], 'Food deleted successfully.');

}

}

Step 8: Add Eloquent API Resources

Now In this step, This is a very important step in creating the rest api in laravel 9. you can use eloquent api resources with api. it will help you to make the same response layout of your model object. we used in the FoodController file. now we have to create it using the following command.

php artisan make:resource Food

Now there is created new file with a new folder on the following path:

app/Http/Resources/Food.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Food extends JsonResource

{

/**

* Transform the resource into an array.

*

* @param \Illuminate\Http\Request $request

* @return array

*/

public function toArray($request)

{

return [

'id' => $this->id,

'name' => $this->name,

'detail' => $this->detail,

'created_at' => $this->created_at->format('d/m/Y'),

'updated_at' => $this->updated_at->format('d/m/Y'),

];

}

}

Run Laravel App:

All steps have been done, now you have to type the given command and hit enter to run the laravel app:

php artisan serve

make sure in details api we will use following headers as listed bellow:

'headers' => [

'Accept' => 'application/json',

'Authorization' => 'Bearer '.$accessToken,

];

Screen Shots :

Login API: Verb:GET, URL:http://localhost:8000/api/login

Food List API: Verb:GET, URL:http://localhost:8000/api/foods

Food Create API: Verb:POST, URL:http://localhost:8000/api/foods

Food Show API: Verb:GET, URL:http://localhost:8000/api/foods/{id}

Food Update API: Verb:PUT, URL:http://localhost:8000/api/foods/{id}

Food Delete API: Verb:DELETE, URL:http://localhost:8000/api/food/{id}

It will help you...

#Laravel 9