در مطلب پیشین در مورد میان افزارها و چگونگی ایجاد آنها توضیح داده ایم. در این مطلب می خواهیم توسط میان افزارها یک سیستم احراز هویت ساده مبتنی بر HTTP را توسط پی اچ پی (HTTP Authentication) و لاراول ایجاد کنیم. قاعدتا برخی از صفحه های سایت شما دارای یک سری منابعی هستند که نمی خواهید توسط افراد ناشناس مورد دسترسی قرار بگیرند، پس لازم است تا پیش از نمایش محتوا به کاربر، یک احراز هویت ساده صورت گیرد.

در مطلب های بعدی روش های دیگری از چگونگی پیاده سازی سیستم احراز هویت را توضیح داده ایم ولی در این مطلب می خواهیم از HTTP Authentication و در غالب یک میان افزار برای احراز هویت کاربران استفاده کنیم. پیش از اینکه میان افزار را ایجاد کنیم، باید مطلب های پیش نیاز مانند کاربرد تابع ()header در پی اچ پی و چگونگی احراز هویت HTTP در پی اچ پی را توضیح دهیم.

تابع ()header در پی اچ پی

تابع ()header یکی از چندین تابعی از زبان پی اچ پی است که درون دسته بندی تابع های شبکه قرار دارد و از آن برای فرستادن یک HTTP Header خام استفاده می شود. توجه کنید که تابع ()header باید حتما پیش از تمامی خروجی ها فراخوانی شود، که می توانند شامل تگ های اچ تی ام ال، خطوط خالی درون فایل و یا حتی خود پی اچ پی باشد.  بنابراین اجرا و منطق قطعه کد زیر نادرست خواهد بود زیر تابع ()header پس از خروجی (HTML) فراخوانی شده است.

تابع ()header به عنوان یک رشته را به عنوان ورودی دریافت می کند که خود این رشته می تواند به چندین صورت باشد. در یکی از حالت ها، رشته باعبارت /HTTP شروع می شود و به دنبال آن کد وضیعیتی تعیین می شود که می خواهیم ارسال شود. به طور مثال اگر صفحه یا منبع مورد درخواست پیدا نشود، سرورهای HTTP مانند آپاچی (Apache) و IIS در ویندوز، کد ۴۰۴ که معادل Page Not Found است را ارسال می کنند و اگر صفحه یا منبع با موفقیت پیدا شود و شما هم اجازه دسترسی را داشته باشید، پس کد عددی ۲۰۰ ارسال خواهد شد.

قطعه کد زیر حالت دیگری از رشته ارسالی به تابع ()header را نشان می دهد و همانطور که می بینید با عبارت Location آغاز شده است. این حالت برای انجام هدایت (Redirection) به آدرسی دیگر استفاده می شود. در مطلبی مجزا در مورد چگونگی انجام Redirection در پی اچ پی و ویژگی های لاراول صحبت کرده ایم.

احراز هویت HTTP توسط پی اچ پی و میان افزار لاراول

ابتدا لازم است تا توسط دستور php artisan make:middleware یک کلاس میان افزار را با نام HttpAuth ایجاد کنیم. سپس کدهای پی اچ پی را به متد ()handle از کلاس اضافه می کنیم. توجه کنیم میان افزار پیش از (Before) اجازه دادن به درخواست بررسی می کند که آیا کاربر مجاز است یا نه؟

مجاز شناخته شدن کاربر از طریق وارد کردن نام کاربری و گذواژه (پسورد) انجام می گیرد و اگر کاربر نام کاربری و گذرواژه را درست وارد کند، پس احراز هویت با موفقیت پایان یافته است و کاربر می تواند محتوای صفحه را ببینید در غیر این صورت پیغام خطا به کاربر نشان داده می شود.

احراز هویت HTTP توسط پی اچ پی و میان افزار لاراول

ابتدا لازم است تا توسط دستور php artisan make:middleware یک کلاس میان افزار را با نام HttpAuth ایجاد کنیم. سپس کدهای پی اچ پی را به متد ()handle از کلاس اضافه می کنیم. توجه کنیم میان افزار پیش از (Before) اجازه دادن به درخواست بررسی می کند که آیا کاربر مجاز است یا نه؟

مجاز شناخته شدن کاربر از طریق وارد کردن نام کاربری و گذواژه (پسورد) انجام می گیرد و اگر کاربر نام کاربری و گذرواژه را درست وارد کند، پس احراز هویت با موفقیت پایان یافته است و کاربر می تواند محتوای صفحه را ببینید در غیر این صورت پیغام خطا به کاربر نشان داده می شود.

احراز هویت HTTP توسط پی اچ پی و میان افزار لاراول

ابتدا لازم است تا توسط دستور php artisan make:middleware یک کلاس میان افزار را با نام HttpAuth ایجاد کنیم. سپس کدهای پی اچ پی را به متد ()handle از کلاس اضافه می کنیم. توجه کنیم میان افزار پیش از (Before) اجازه دادن به درخواست بررسی می کند که آیا کاربر مجاز است یا نه؟

مجاز شناخته شدن کاربر از طریق وارد کردن نام کاربری و گذواژه (پسورد) انجام می گیرد و اگر کاربر نام کاربری و گذرواژه را درست وارد کند، پس احراز هویت با موفقیت پایان یافته است و کاربر می تواند محتوای صفحه را ببینید در غیر این صورت پیغام خطا به کاربر نشان داده می شود.

احراز هویت HTTP توسط پی اچ پی و میان افزار لاراول

ابتدا لازم است تا توسط دستور php artisan make:middleware یک کلاس میان افزار را با نام HttpAuth ایجاد کنیم. سپس کدهای پی اچ پی را به متد ()handle از کلاس اضافه می کنیم. توجه کنیم میان افزار پیش از (Before) اجازه دادن به درخواست بررسی می کند که آیا کاربر مجاز است یا نه؟

مجاز شناخته شدن کاربر از طریق وارد کردن نام کاربری و گذواژه (پسورد) انجام می گیرد و اگر کاربر نام کاربری و گذرواژه را درست وارد کند، پس احراز هویت با موفقیت پایان یافته است و کاربر می تواند محتوای صفحه را ببینید در غیر این صورت پیغام خطا به کاربر نشان داده می شود.

کدهای افزودنی به فایل کلاس میان افزار

پس از ایجاد فایل میان افزار به نام HttpAuth.php در مسیر app/Http/Middleware باید کدهای زیر را درون آن کپی کنید. توجه کنید کدهای زیر تمامی کدهای درون فایل را نشان می دهد ولی آن چیزی که مهم است، کدهای درون متد ()handle است که در خطوط ۱۸ تا ۳۱ تعریف شده اند.

اگر دقت کنید می بینید که کدها پیش از دستور ;(return $next($request قرار دارند، پس میان افزار به صورت پیش از درخواست است. در خطوط ۱۸ و ۱۹ دو متغیر تعریف شده اند که به ترتیب نام کاربری و گذرواژه آنرا نگهداری می کنند. در صورتی که کاربر چیزی جز این دو متغیر را وارد کند، پس احراز هویت ناموفق خواهد بود.

در خط ۲۱ که معادل قطعه کد زیر است بررسی می شود که آیا دو دو کلید PHP_AUTH_USER و PHP_AUTH_PW از آرایه سراسری SERVER_$ خالی نباشند. شکل زیر (انتهای مطالب) پنجره ای را نشان می دهد که نام کاربری و گذرواژه را از کاربر دریافت می کند. نام کاربری که وارد می شود به عنوان مقدار کلید PHP_AUTH_USER و گذرواژه ای که وارد می شود به عنوان مقدار کلید PHP_AUTH_PW از آرایه سراسری SERVER_$ در نظر گرفته می شود.

بنابراین اگر کاربر هم نام کاربری و هم گذرواژه را وارد کرده باشد، صرف نظر از اینکه درست یا نادرست باشد، مقدار متغیر has_supplied_credential$ برابر true خواهد بود، در غیر این صورت اگر هر دو مقدار مام کاربری و گذرواژه یا حتی یکی از آنها وارد نشده باشد، پس متغیر has_supplied_credential$ برابر با false خواهد بود. دلیل این است که از عملگر AND یا && استفاده شده است.

در خط ۲۳ که معادل قطعه کد زیر است بررسی می شود که آیا مقدارهای وارد شده برای نام کاربری و گذرواژه با مقدارهای متغیرهای AUTH_USER$ و AUTH_PASS$ یکسان هستند.

در نهایت و مطابق کد زیر، اگر مقدار متغیر has_supplied_credentials$ برابر با false باشد، یعنی اینکه یا نام کاربری یانه گذرواژه درست وارده شده است یا این که مقدار متغیرhas_supplied_credential$ برابر باشد، پس تابع ()header دو بار فراخوانی می شود.

بنابراین اگر شرط بالا برقرار نباشد، به این معنی است که کاربر به درستی اطلاعات را وارد نکرده، پس احراز هویت ناموفق بوده است، بنابراین باید کد وضعیت ۴۰۱ برگشت داده شود. کد ۴۰۱ زمانی برگشت داده می شود که کاربر بخواهد به منبعی روی وب دسترسی پیدا کند ولی به دلیل عدم دسترسی و احراز هویت نا موفق، توانایی و اجازه دسترسی را نخواهد داشت.

ثبت میان افزار در فایل Kernel.php

همانطور که توضیح دادیم پس از ایجاد محتوا و منطق میان افزار درون فایل مربوطه، باید آنرا درون فایل Kernel.php ثبت کنیم. برای این کار ابتدا باید مطابق شکل زیر مسیر فایل میان افزار HttpAuth را به درون آرایه middleware$ اضافه کنیم.

 

سپس در ساده ترین حالت برای عضویت و ثبت میان افزار و انستاب یک نام به آن، باید مطابق شکل زیر آنرا به درون متغیر routeMiddleware$ اضافه کنید. همانطور که می بینید من از نام HttpAuth برای میان افزار در مسیر App\Http\Middleware/HttpAuth.php\ استفاده کرده ام.

پس از آن باید توسط متد ()middleware و تعیین نام میان افزار که در اینجا و کد زیر نام میان افزار HttpAuth است، برای مسیر تعیین کنید که کدام میان افزار به آن انتساب داده شود. در کد زیر تنها و تنها برای آزمایش عملکرد میان افزار آنرا به مسیر ریشه انستاب داده ایم.

بنابراین زمانی که وارد آدرس ریشه سایت شوید، پیغامی مانند شکل زیر نشان داده می شود که باید نام کاربری وگذرواژه را وارد کنید که در این مثال نام کاربری admin و گذرواژه برابر با mypass است که پیش از این درون فایل میان افزار تعیین کرده بودیم.

منابع و پیوندهای مفید

فهرست کامل کدهای وضعیت HTTP و مفهوم هر کدام را می توانید از اینجا بخوانید.

برای آگاهی بیشتر از آریه سراسری SERVER_$ می توایند اینجا را بخوانید.

برای آگاهی بیشتر در مورد تابع ()header می توانید اینجا را بخوانید.

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