In this tutorial, we will learn how to build a multiple guards authentication api in laravel 8. We will create multiple authentication api in laravel 8. This article will give you multiple authentication guard drivers (including API) in laravel 8 and how to setup multi-auth for laravel 8 apis.
Laravel provide easy way to create api. if you have authentication in your mobile app than you can easily do it using passport. Laravel 8 Passport provide way to create auth token for validating users.
Follow the steps below and you can build a multiple guards authentication api in laravel 8.
Step 1: Install Laravel Project
First, you need to download the laravel fresh setup. Use this command then download laravel project setup:
composer create-project --prefer-dist laravel/laravel blog |
Step 2: Setup Database
After successfully installing laravel 8 Application, go to your project .env file and set up database credential and move next step:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=here your database name
DB_USERNAME=here database username
DB_PASSWORD=here database password
Step 3 : Install Passport
In this step we need to install passport via the Composer package manager, so one your terminal and run the following command
composer require laravel/passport
After successfully install package, we require to get default migration for create new passport tables in our database, so run the command below
php artisan migrate |
php artisan passport:install |
Step 4 : Create Admin Table
In this step we need to create admins table and admin model for login into admin, so open the terminal and the command shown below
php artisan make:model Admin -m |
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdminsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('admins');
}
}
php artisan migrate |
Step 5 : Passport Configuration
In this step, we have to do configuration on three place model, service provider and auth config file. So you just have to do following changes on that file.
In model we added HasApiTokens class of Passport,
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\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* 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',
];
}
app/Models/Admin.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class Admin extends Authenticatable
{
use HasFactory, Notifiable, HasApiTokens;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
}
Step 6 : Add Passport in AuthServiceProvider
Now open app/Providers/AuthServiceProvider.php file add route function and then define your roles and descriptions for each role and then specify the default role that would be attached if a role is not explicitly requested for.
app/Providers/AuthServiceProvider.php
<?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
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensCan([
'user' => 'User Type',
'admin' => 'Admin User Type',
]);
}
}
Step 7 : Create Auth Guard
In this step, you can define auth guard and set other guard and add provider for each role as well. This driver should be eloquent and the model should be the model of the tables you want each role to authenticate from.
config/auth.php
// Add Guards
'guards' => [
'user' => [
'driver' => 'session',
'provider' => 'users',
],
'user-api' => [
'driver' => 'token',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'admin-api' => [
'driver' => 'token',
'provider' => 'admins',
],
],
// Add Provider
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
Step 8 : Add Scope Middleware
Laravel provide scope middleware check for all scopes. Now you have to add scope middleware in kernel.php. Let's open kernel.php add the middleware given below:
app/Http/Kernel.php
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
];
Step 9 : Create Custom route File
Now you will create custom route file like admin.php and user.php etc.. Let's create api folder in route directory and create two files given below in api folder.
1)admin.php
2)user.php
routes/api/admin.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LoginController;
/*
|--------------------------------------------------------------------------
| 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('admin/login',[LoginController::class, 'adminLogin'])->name('adminLogin');
Route::group( ['prefix' => 'admin','middleware' => ['auth:admin-api','scopes:admin'] ],function(){
// authenticated staff routes here
Route::get('dashboard',[LoginController::class, 'adminDashboard']);
});
routes/api/user.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LoginController;
/*
|--------------------------------------------------------------------------
| 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('user/login',[LoginController::class, 'userLogin'])->name('userLogin');
Route::group( ['prefix' => 'user','middleware' => ['auth:user-api','scopes:user'] ],function(){
// authenticated staff routes here
Route::get('dashboard',[LoginController::class, 'userDashboard']);
});
Step 10 : Register Routes File In RouteServiceProvider
In this step, You can register route file in RouteServiceProvider.php.
app/Http/Controllers/LoginController.php
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api/admin.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api/user.php'));
});
Step 11 : Create Controller
In this step, You can create new controller as LoginController and put the code given below.
app/Http/Controllers/LoginController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Admin;
use Hash;
use Validator;
use Auth;
class LoginController extends Controller
{
public function userDashboard()
{
$users = User::all();
$success = $users;
return response()->json($success, 200);
}
public function adminDashboard()
{
$users = Admin::all();
$success = $users;
return response()->json($success, 200);
}
public function userLogin(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required',
]);
if($validator->fails()){
return response()->json(['error' => $validator->errors()->all()]);
}
if(auth()->guard('user')->attempt(['email' => request('email'), 'password' => request('password')])){
config(['auth.guards.api.provider' => 'user']);
$user = User::select('users.*')->find(auth()->guard('user')->user()->id);
$success = $user;
$success['token'] = $user->createToken('MyApp',['user'])->accessToken;
return response()->json($success, 200);
}else{
return response()->json(['error' => ['Email and Password are Wrong.']], 200);
}
}
public function adminLogin(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required',
]);
if($validator->fails()){
return response()->json(['error' => $validator->errors()->all()]);
}
if(auth()->guard('admin')->attempt(['email' => request('email'), 'password' => request('password')])){
config(['auth.guards.api.provider' => 'admin']);
$admin = Admin::select('admins.*')->find(auth()->guard('admin')->user()->id);
$success = $admin;
$success['token'] = $admin->createToken('MyApp',['admin'])->accessToken;
return response()->json($success, 200);
}else{
return response()->json(['error' => ['Email and Password are Wrong.']], 200);
}
}
}
Now we are ready to run streaming export csv with cursor in laravel so run command given below for quick run:
php artisan serve
Now you can open URL given below on your postman app:
// User Login
localhost:8000/user/login // User Dashboard localhost:8000/user/dashboard // Admin Login localhost:8000/admin/login // Admin Dashboard localhost:8000/admin/dashboard |
'headers' => [
'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken, ] |
I hope this example helps you.