Shopping cart

    Subtotal $0.00

    View cartCheckout

    Protecting Laravel APIs with Passport and Implementing RBAC

    • Home
    • API
    • Protecting Laravel APIs with Passport and Implementing RBAC
    laravel_passportapi

    Introduction

    Laravel is a powerful PHP framework that simplifies API development, and Passport provides a full OAuth2 server implementation for secure authentication. In this guide, we will explore how to protect Laravel APIs using Passport and implement RBAC to control user access based on roles and permissions.

    Mermaid Diagram showing how Passport works

    Step 1: Installing Laravel Passport

    First, install Laravel Passport via Composer:

    composer require laravel/passport

    After installation, run the following commands to set up Passport:

    php artisan migrate
    php artisan passport:install

    The passport:install command generates encryption keys and access tokens required for authentication.

    Next, add the HasApiTokens trait to your User model:

    use Laravel\Passport\HasApiTokens;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use HasApiTokens, Notifiable;
    }

    Then, register Passport’s routes in AuthServiceProvider.php:

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

    Finally, set the driver option in config/auth.php for API authentication:

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

    Step 2: Creating API Authentication Routes

    Define authentication routes in routes/api.php:

    use App\Http\Controllers\AuthController;
    
    Route::post('/register', [AuthController::class, 'register']);
    Route::post('/login', [AuthController::class, 'login']);
    Route::middleware('auth:api')->get('/user', function (Request $request) {
        return $request->user();
    });

    Implementing Authentication in AuthController

    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Models\User;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Auth;
    
    class AuthController extends Controller
    {
        public function register(Request $request)
        {
            $request->validate([
                'name' => 'required',
                'email' => 'required|email|unique:users',
                'password' => 'required|min:6',
            ]);
    
            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => Hash::make($request->password),
            ]);
    
            return response()->json(['token' => $user->createToken('API Token')->accessToken]);
        }
    
        public function login(Request $request)
        {
            if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
                return response()->json(['token' => Auth::user()->createToken('API Token')->accessToken]);
            }
            return response()->json(['error' => 'Unauthorized'], 401);
        }
    }

    Step 3: Implementing Role-Based Access Control (RBAC)

    Step 3.1: Creating Migration and Models

    Run the following command to create the roles and permissions tables:

    php artisan make:migration create_roles_and_permissions_tables

    Define the migration schema in database/migrations/{timestamp}_create_roles_and_permissions_tables.php:

    Schema::create('roles', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    Schema::create('role_user', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->foreignId('role_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });

    Run the migration:

    php artisan migrate

    Step 3.2: Defining Role Relationships in Models

    Role Model

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Role extends Model
    {
        protected $fillable = ['name'];
    
        public function users()
        {
            return $this->belongsToMany(User::class);
        }
    }

    User Model

    class User extends Authenticatable
    {
        public function roles()
        {
            return $this->belongsToMany(Role::class);
        }
    
        public function hasRole($role)
        {
            return $this->roles()->where('name', $role)->exists();
        }
    }

    Step 3.3: Middleware for Role Authorization

    Create a middleware to check user roles:

    php artisan make:middleware RoleMiddleware

    Edit RoleMiddleware.php:

    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    
    class RoleMiddleware
    {
        public function handle(Request $request, Closure $next, $role)
        {
            if (!Auth::user() || !Auth::user()->hasRole($role)) {
                return response()->json(['error' => 'Forbidden'], 403);
            }
            return $next($request);
        }
    }

    Register the middleware in Kernel.php:

    protected $routeMiddleware = [
        'role' => \App\Http\Middleware\RoleMiddleware::class,
    ];

    Step 3.4: Protecting API Routes

    Modify routes/api.php to include RBAC:

    Route::middleware(['auth:api', 'role:admin'])->group(function () {
        Route::apiResource('/cars', CarController::class);
    });

    Conclusion

    Securing Laravel APIs with Passport ensures authenticated access, and implementing RBAC provides fine-grained control over user actions. By following this guide, you can effectively authenticate users and manage roles, enhancing the security of your Laravel applications.

    For professional Laravel development and security solutions, check out Techliphant. Our experts can help you implement robust authentication and role-based access control in your Laravel projects, ensuring top-notch security and performance.

    References

    Leave A Comment

    Your email address will not be published. Required fields are marked *