هویت پایه HTTP در لاراول (HTTP Basic Authentication)

احراز هویت پایه HTTP در لاراول، یک روش سریع بدون ایجاد صفحه‌ی log in اختصاصی در برنامه، جهت احراز هویت کاربران فراهم می‌کند. برای شروع کار، middlewareauth.basic  را به مسیر خود attach کنید. middleware auth.basic  به صورت پیش‌فرض در فریم ورک لاراول قرار دارد، بنابراین، نیازی به تعریف آن ندارید:

Route::get('profile', function () {
// Only authenticated users may enter...
})->middleware('auth.basic');

پس از آن که middleware به مسیر attach شد، هنگامی که کاربر قصد دسترسی به مسیر در مرورگر را دارد، برنامه به صورت خودکار از کاربر مدارک مورد نظر (credentials) را درخواست می‌کند. در حالت پیش‌فرض، میدلور auth.basic ستون email در رکورد کاربر را به عنوان نام کاربری یا username مورد استفاده قرار می‌دهد.

مروری بر FastCGI

اگر از PHP FastCGI استفاده می‌کنید، احراز هویت پایه HTTP لاراول ممکن است به درستی کار نکند. برای حل این مشکل، باید کد زیر را به فایل .htaccess اضافه کنید:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

احراز هویت پایه HTTP به صورت ناپایدار در لاراول

همچنین، می‌توانید بدون تنظیم شناسه کوکی کاربر در session از احراز هویت پایه HTTP استفاده کنید که به صورت ویژه برای احراز هویت API مفید است. برای انجام این کار، یک middleware را تعریف کنید که متد onceBasic را فراخوانی می‌کند. در صورتی که هیچ پاسخی توسط متد onceBasic برگردانده نشود، درخواست بیشتر به داخل برنامه راه می‌یابد:

{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, $next)
{
return Auth::onceBasic() ?: $next($request);
}

}

سپس، route middleware را ثبت کنید و آن را به یک مسیر attach کنید:

Route::get('api/user', function () {
// Only authenticated users may enter...
})->middleware('auth.basic.once');

اضافه کردن guard سفارشی

می‌توانید guardهای احراز هویت خود را با استفاده از متد extend و در  facade Auth  تعریف کنید. شما باید فراخوانی extend را در یک service provider قرار دهید. از آنجا که لاراول به صورت پیش‌فرض شامل یک AuthServiceProvider است، می‌توانید کد را در این provider قرار دهید:

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

class AuthServiceProvider extends ServiceProvider
{
/**
* Register any application authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();

Auth::extend('jwt', function ($app, $name, array $config) {
// Return an instance of Illuminate\Contracts\Auth\Guard...

return new JwtGuard(Auth::createUserProvider($config['provider']));
});
}
}

همانطور که در مثال بالا مشاهده می‌کنید، فراخوانی متد extend ، باید پیاده سازی Illuminate\Contracts\Auth\Guard را بازگرداند. این رابط شامل چندین متد است که برای تعریف یک guard به صورت سفارشی لازم است. زمانی که guard سفارشی تعریف شده است، می‌توانید از این guard در پیکربندی guards فایل پیکربندی auth.php خود استفاده کنید:

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

اضافه کردن User Provideهای سفارشی در احراز هویت پایه HTTP در لاراول

اگر از ارتباط پایگاه داده سنتی برای ذخیره کاربران خود استفاده نمی‌کنید، باید برنامه لاراول را با user provider احراز هویت خود گسترش دهید. ما از متد provider در  facade Auth  برای تعریف user provider سفارشی خود استفاده می‌کنیم:

use App\Extensions\RiakUserProvider;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
/**
* Register any application authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();

Auth::provider('riak', function ($app, array $config) {
// Return an instance of Illuminate\Contracts\Auth\UserProvider...

return new RiakUserProvider($app->make('riak.connection'));
});
}
}

پس از آنکه provider را با استفاده از متد provider ثبت کردید، می‌توانید به user provider جدید خود در فایل پیکربندی auth.php سوئیچ کنید. ابتدا، یک provider که از درایور جدید شما استفاده می‌کند، تعریف کنید:

'providers' => [
'users' => [
'driver' => 'riak',
],
],

در نهایت، می‌توانید از این provider در پیکربندی guards خود استفاده کنید:

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],

قرارداد User Provide

پیاده سازی‌های قرارداد Illuminate\Contracts\Auth\UserProvider فقط مسئول دریافت یک پیاده سازی Illuminate\Contracts\Auth\Authenticatable از یک سیستم ذخیره سازی پایدار، مانند MySQL، Riak و غیره است. این دو رابط امکان می‌دهند تا مکانیزم‌های احراز هویت لاراول بدون توجه به نحوه ذخیره داده‌های کاربر یا نوع کلاسی که برای نمایش آن استفاده می‌شود، به کار خود ادامه دهند.

اجازه دهید، نگاهی اجمالی به قرارداد Illuminate\Contracts\Auth\UserProvider داشته باشیم:

public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);

}

تابع retrieveById در حالت کلی یک کلید را که نماینده‌ی کاربر است، مانند یک شناسه یا ID را از یک پایگاه داده مانند MySQL که مقدار آن به صورت خودکار برای هر کاربر افزایش می‌یابد (auto-incrementing)، دریافت می‌کند. پیاده سازی Authenticatable براساس شناسه یا ID باید بازیابی و توسط متد بازگردانده شود.

تابع retrieveByToken یک کاربر را با identifier$  منحصر به فرد و شناسه یادآوری $token که در فیلد remember_token ذخیره شده است، بازیابی می‌کند. مانند متد قبل، پیاده سازی Authenticatable باید بازگردانده شود.

متد updateRememberToken فیلد $user ستون remember_token را با $token جدید بروز می‌کند. این توکن می‌تواند، یک توکن جدید باشد که با یک تلاش موفقیت‌آمیز "remember me" کاربر و ورود به برنامه اختصاص داده می‌شود یا یک توکن که هنگام خروج کاربر از سیستم اختصاص داده می‌شود.

متد retrieveByCredentials  در هنگام تلاش برای ورود به برنامه، آرایه‌ای از مدارک (credentials) منتقل شده به متد Auth::attempt را دریافت می‌کند. سپس، این متد باید از سیستم پایه ذخیره سازی دائمی، برای کاربری که اطلاعاتش با آرگومان credential ارسالی مطابقبت دارد، کوئری بگیرد. به طور معمول، این متد یک کوئری با شرط “where” را در $credentials['username']] اجرا می‌کند. پس از آن، این متد باید پیاده سازی Authenticatabl e را بازگرداند. این متد نباید اعتبارسنجی پسورد یا احراز هویت کاربر را انجام دهد.

متد validateCredentials باید  $user  معین را با $credentials برای احراز هویت کاربر مقایسه کند. برای مثال، این متد احتمالا باید از Hash::check استفاده کند تا مقدار $user->getAuthPassword()  را با مقدار $credentials['password'] مقایسه کند. این متد باید مقدار true یا false را برای مشخص کردن اینکه پسورد معتبر است یا خیر، بر‌گرداند.

قرارداد احراز هویت Authenticatable

حالا که تمام متدهای UserProvider را بررسی کردیم، اجازه دهید، نگاهی به قرارداد Authenticatable داشته باشیم. به یاد داشته باشید، provider باید پیاده سازی‌های این رابط را از متدهای retrieveById و retrieveByCredentials بازگرداند:

public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();

}

این رابط بسیار ساده است، متد getAuthIdentifierName باید نام فیلد کلید اصلی کاربر را برگرداند و متد getAuthIdentifier باید مقدار کلید اصلی کاربر را برگرداند. در بخش back-end پایگاه داده MySQL، این کلید اصلی به صورت auto-incrementing است که به طور خودکار افزایش می‌یابد. getAuthPassword باید پسورد هش شده کاربر را برگرداند. این رابط به سیستم احراز هویت امکان می‌دهد تا بدون در نظر گرفتن ORM یا لایه انتزاعی ذخیره سازی اطلاعات مورد استفاده، بتواند با هر کلاس userای کار کند. در حالت پیش‌فرض، لاراول شامل یک کلاس User در دایرکتوری app است که این رابط را برای شما پیاده سازی می‌کند، بنابراین، می‌توانید به این کلاس برای مشاهده مثالی از این پیاده سازی مراجعه کنید.

رویدادها

چند رویداد مختلف در طول فرایند احراز هویت کاربر در لاراول اتفاق می‌افتد. می‌توانید listenerها را به این رویدادها در EventServiceProvider خود attach کنید:

/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Registered' => [
'App\Listeners\LogRegisteredUser',
],

'Illuminate\Auth\Events\Attempting' => [
'App\Listeners\LogAuthenticationAttempt',
],

'Illuminate\Auth\Events\Authenticated' => [
'App\Listeners\LogAuthenticated',
],

'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],

'Illuminate\Auth\Events\Failed' => [
'App\Listeners\LogFailedLogin',
],

'Illuminate\Auth\Events\Logout' => [
'App\Listeners\LogSuccessfulLogout',
],

'Illuminate\Auth\Events\Lockout' => [
'App\Listeners\LogLockout',
],

'Illuminate\Auth\Events\PasswordReset' => [
'App\Listeners\LogPasswordReset',
],
];

تهیه شده توسط  الهه قنبری 

لاراول
فقط
خوش آمدید!
ایجاد حساب کاربری