آموزش استفاده از OAuth در لاراول | آموزش ساخت OAuth با Laravel Passport

دسته بندی: لاراول
زمان مطالعه: 10 دقیقه
۲۹ مرداد ۱۳۹۹

فریم ورک محبوب لاراول از همان ابتدا احراز هویت را از طریق فرم‌های ورود به سیستم معمولی آسان کرده است، اما اگر بخواهیم با API‌ها سر و کار داشته باشیم چطور؟ آیا این فریم ورک محبوب و قدرتمند فکری به حال این API‌ها کرده است؟ برای ساخت یک OAuth در لاراول از Laravel Passport استفاده می‌کنیم. پکیج Laravel Passport به همراه Migration ها، Route‌ها و Middleware‌ها ایجاد می‌شود که از OAuth2 Server به عنوان یک dependency استفاده می‌کنند. در ادامه به آموزش استفاده از OAuth در لاراول می‌پردازیم؛ با ما همراه باشید.

فهرست محتوای این مقاله

نیازمندی‌های اولیه

برای شروع کار باید حداقل از نسخه ۷ PHP استفاده کنید و یک دانش کافی از Laravel و Authentication داشته باشید.

شروع به کار

در ابتدا می‌خواهم Composer را نصب کنیم، برای این کار Terminal خود را در محیط Server خود (Xamp ,Wamp یا ...) باز کنید و با استفاده از دستور زیر Composer را نصب کنید.

$ composer install

در مرحله دوم با استفاده از دستور زیر به پوشه Desktop تغییر مکان بدهید.

$ cd Desktop/

در مرحله سوم با استفاده از دستور زیر یک اپلیکیشن جدید لاراول ایجاد کنید.

$ composer create-project --prefer-dist laravel/laravel auth-app

در مرحله چهارم با استفاده از دستور زیر به پوشه auth-app تغییر مکان بدهید.

$ cd auth-app/

در مرحله پنجم Migration‌ها را اجرا کنید.

$ php artisan migrate

و در مرحله آخر به صورت زیر و با توجه به نام Database و مشخصات دیگر آن فایل env. را سفارشی سازی می‌کنیم.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=Database
DB_USERNAME=Username
DB_PASSWORD=Password

حال یک Key برای برنامه ایجاد کنید.

$ php artisan key:generate

حال برنامه لاراولی خود را اجرا کنید.

$ php artisan serve

به‌طور پیش‌فرض برنامه شما برروی Port هاست محلی شما یا همان Local Host یعنی https://127.0.0.1:8000 ایجاد می‌شود.

نصب Laravel Passport

بعد از انجام دستورات بالا نوبت به نصب Laravel Passport می‌رسد. برای نصب آن از دستور زیر در پوشه برنامه لاراولی خود استفاده کنید.

composer require laravel/passport

Migrate کردن Database

بعد از نصب کامل Laravel Passport باید Migration‌ها را به Database ارسال کنیم. بعد از اجرای دستور Migration، جدول‌های جدیدی در Database ما ایجاد می‌شوند.

$ php artisan migrate

حال یک جدول User در فایل Migration برنامه به شکل زیر ایجاد می‌کنیم.

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
     public function up()
  {
      Schema::create(‘users’, function (Blueprint $table) {
          $table->bigincrements(‘id’);
          $table->string(‘first_name’);
          $table->string(‘last_name’);
          $table->string(‘email’)->unique();
          $table->timestamp(‘email_verified_at’)->nullable();
          $table->string(‘password’);
          $table->rememberToken();
          $table->timestamps();
      });
  }
  public function down()
  {
       Schema::dropIfExists(‘users’);
  }
}

کانفیگ کردن Laravel Passport

در این مرحله باید  سه بخش Model ,Service Provider و Config/auth.php را به‌ترتیب شکل زیر و به راحتی کانفیگ کنیم.

Model

در مدل User باید Laravel\Passport\HasApiTokens که یک trait است را اضافه کنیم.

<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
  use HasApiTokens, Notifiable;
  protected $fillable = [
      ‘name’, ‘email’, ‘password’,
  ];
  protected $hidden = [
       ‘password’, ‘remember_token’,
  ];
}

Servide Provider

در app/Providers/AuthServiceProvider.php باید Passport::routes را Call کنیم.

<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
      Protected $policies = [
         ‘App\Model’ => ‘App\Policies\Modelpolicy’
       ];
   Public function boot()
     {
     $this->registerPolicies();
     passport::routes();
}}

auth.php

در  Config/auth.php باید کانفیگ API Auth را اضافه کنیم.

<?php
return [
   ‘defaults’ => [
        ‘guard’ => ‘web’,
        ‘passwords’ => ‘users’,
    ],
    ‘guards’ => [
        ‘web’ => [
            ‘driver’ => ‘session’,
            ‘provider’ => ‘users’,
      ],
      ‘api’ => [
          ‘driver’ => ‘passport’,
          ‘provider’ => ‘users’,
       ],
   ],
   ‘providers’ => [
       ‘users’ => [
           ‘driver’ => ‘eloquent’,
   ‘model’ => App\User::class,
        ],
    ],
    ‘password’ => [
       ‘users’ => [
        ‘provider’ => ‘users’,
        ‘table’ => ‘password_resets’,
        ‘expire’ => 60,
    ],
  ],
];

تنظیم Route‌های API

در این مرحله باید تمام Route‌های زیر را در routes/api.php ایجاد کنید.

<?php
use Illuminate\Http\Request;
Route::group([
     ‘prefix’ => ‘auth’
], function () {
      Route::post(‘login’, ‘Auth\[email protected]’)->name(‘login’);
      Route::post(‘register’, ‘Auth\[email protected]’);
      Route::group([
         ‘middleware’ => ‘auth:api’
       ], function() {
           Route::get(‘logout’, ‘Auth\[email protected]’);
           Route::get(‘user’, ‘Auth\[email protected]’);
    });
});

ساخت Controller

در این مرحله باید یک Controller به‌نام AuthController ایجاد کنید.

$ php artisan make:controller Auth/AuthController

پس از ایجاد AuthController آن را باز کرده و سه تابع Register Users ,Login Users و Logout را به راحتی و توسط دستورات زیر ایجاد کنید.

<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
    //
    public function login(Request $request) {
        $request->validate([
             ‘email’ => ‘required|string|email’,
             ‘password’ => ‘required|string’
           ]);
        $credentials = request([‘email’, ‘password’]);
     // print_r($credentials);die;
     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();
     return response()->json([
         ‘access_token’ => $tokenResult->accessToken,
         ‘token_type’ => ‘Bearer’,
         ‘expires_at’ => Carbon::parse(
             $tokenResult->token->expires_at
          )->toDateTimeString()
      ]);
   }
   public function register(Request $request)
   {
          $request->validate([
                 ‘fName’ => ‘required|string’,
                 ‘lName’ => ‘required|string’,
                 ‘email’ => ‘required|string|email|unique:users’,
                 ‘password’ => ‘required|string’
          ]);
          $user = new User;
          $user->first_name = $request->fName;
          $user->last_name = $request->lName;
          $user->email = $request->email;
          $user->password = bcrypt($request->password);
          $user->save();
          return response()->json([
               ‘message’ => ‘Successfully created user!’
          ], 201);
   }
   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());
}
}

اضافه کردن Middleware

توسط دستور زیر یک Middleware جدید ایجاد کنید.

$ php artisan make:middleware Cors
<?php
namespace App\Http\Middleware;
use Closure;
class Cors
{
    Public function handle($request, Closure $next)
      {
        return $next($request)
         ->header(‘Access-Control-Allow-Origin’, ‘*’)
         ->header(‘Access-Control-Allow-Methods’,
                   ‘GET, POST, PUT, PATCH, DELETE, OPTIONS’)
         ->header(‘Access-Control-Allow-Headers’,
                  ‘Content-Type, Authorization, X-Requested-With, X-XSRF-TOKEN’);
}
}

Register کردن Middleware جدید

در app/Http/Kernal.php دستورات زیر را وارد کنید.

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
     protected $middleware = [
     \App\Http\Middleware\CheckForMaintenanceMode::class,
     \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
     \App\Http\Middleware\TrimStrings::class,
     \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
     \App\Http\Middleware\TrustProxies::class,
     \App\Http\Middleware\Cors::class,
    ];   
}

با استفاده از دستورات زیر Passport را Run کنید.

$ php artisan passport:install
$ php artisan serve

Test کردن

برای Test برنامه و یقین داشتن از این که کلیه موارد به درستی کار می‌کنند لطفاً مراحل زیر را دنبال کنید.

  1. با ارسال نام، نام خانوادگی، ایمیل و رمز عبور از طریق Post Request یک کاربر جدید ایجاد کنید.
  2. اکنون با ایمیل و رمز عبور خودتان وارد شوید.
  3. اگر توجه کنید هنگامی که وارد می‌شوید یک Token دریافت می‌کنید. شما می‌توانید این Token را در فضای محلی یا Local Storage ذخیره کنید. این Token همچنین در جدول oauth_access_tokens نیز ذخیره می‌شود.

جمع‌بندی:

در این مقاله با فرض این‌که شما با لاراول آشنایی کمی دارید، به آموزش ساخت OAuth با Laravel Passport پرداختیم. در پایان اگر هر گونه سوال یا نظری در مورد استفاده از OAuth در لاراول داشتید خوشحال می‌شویم که با ما و کاربران سون لرن در میان بگذارید.

اگر به یادگیری بیشتر لاراول علاقه دارید می‌توانید در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

چه امتیازی به این مقاله می دید؟
نویسنده علی مجیدی
Backend Developer | PHP & Laravel Developer

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :