API یا رابط برنامهنویسی برنامه، یک مجموعه از روشها و تعاریف است که امکان تعامل بین برنامههای کامپیوتری مختلف را فراهم میکند. در لاراول، یک چارچوب توسعه وب پرطرفدار، API قدرتمندی برای ساختن رابطهای برنامهنویسی ارائه میدهد. در این مقاله، به بررسی امنیت و ویژگیهای API در لاراول خواهیم پرداخت.
فهرست
1.مفهوم API
2.API در لاراول
روتها و کنترلرها
نوعهای پاسخ
نمایش و فراخوانی API
3.امنیت API
محدود کردن دسترسی
استفاده از توکنهای دسترسی
استفاده از HTTPS
4.ویژگیهای API در لاراول
کش
ولیدیشن
آزمون واحد
5.نتیجهگیری
مفهوم API
API مخفف عبارت Application Programming Interface میباشد و به عنوان یک واسط برنامهنویسی عمل میکند که اجازه ارسال و دریافت دادهها بین برنامهها را فراهم میکند. API به برنامهنویسان این امکان را میدهد تا از عملکرد و ویژگیهای سایر برنامهها استفاده کنند و با استفاده از آنها برنامه خود را توسعه دهند.
API در لاراول
لاراول یک چارچوب توسعه وب قدرتمند است که قابلیتهای فراوانی برای ساخت و استفاده از APIها ارائه میدهد. با استفاده از لاراول، میتوانید به سادگی رابطهای برنامهنویسی قدرتمندی را برای برنامههای خود بسازید و درخواستها و پاسخها را به صورت مناسب مدیریت کنید.
روتها و کنترلرها
در لاراول، روتها و کنترلرها برای تعریف و مدیریت رابطهای برنامهنویسی استفاده میشوند. روتها نقشی مشابه آدرسهای URL دارند و با درخواستهای مشخصی مطابقت
دارند. کنترلرها مسئول پاسخ دادن به درخواستها و ارسال پاسخهای مناسب به کاربران هستند.
نوعهای پاسخ
لاراول به صورت پیشفرض نوعهای مختلفی از پاسخها را پشتیبانی میکند. میتوانید پاسخهای JSON، XML، دادههای دودویی و... را تعریف کنید و با توجه به نیاز خود از آنها استفاده کنید.
نمایش و فراخوانی API
با استفاده از لاراول، میتوانید رابطهای برنامهنویسی خود را به سادگی نمایش دهید و توسط سایر برنامهها یا سرویسها فراخوانی کنید. لاراول امکاناتی مانند تولید مستندات API، تست رابطها و ردیابی درخواستها را نیز فراهم میکند.
مثال ساده:
برای ساخت یک API در لاراول، میتوانید از روشهای مختلفی استفاده کنید. یک روش ساده و معمول برای ساخت API در لاراول، استفاده از روتها و کنترلرها است. در ادامه یک مثال ساده را برای شما توضیح میدهم:
ابتدا میتوانید یک روت در فایل routes/api.php
تعریف کنید. به عنوان مثال، فرض کنید میخواهید یک روت برای دریافت اطلاعات کاربران بسازید. میتوانید روت زیر را تعریف کنید:
Route::get('/users', 'UserController@index');
سپس باید کنترلر مربوط به این روت را ایجاد کنید. با دستور زیر، یک کنترلر با نام UserController
ایجاد کنید:
php artisan make:controller UserController
در کنترلر UserController
، متدهای مربوط به این روت را پیادهسازی کنید. برای مثال، برای روت users/
میتوانید متد index
را به صورت زیر تعریف کنید:
public function index()
{
$users = User::all();
return response()->json($users);
}
در این مثال، ما همه کاربران را از جدول users
دریافت کرده و به صورت JSON بازمیگردانی میکنیم.
در نهایت، میتوانید API خود را تست کنید. با اجرای سرور توسعه لاراول (php artisan serve
)، میتوانید روت users/
را درخواست کنید و لیست کاربران را دریافت کنید.
به این ترتیب، با استفاده از روش فوق میتوانید یک API ساده در لاراول بسازید. البته، این مثال فقط یک شروع ساده است و شما میتوانید با توجه به نیازهای خود، روتها و کنترلرهای دیگر را تعریف کنید و عملکرد مورد نظر خود را پیادهسازی کنید.
امنیت API
امنیت API از اهمیت بالایی برخوردار است، زیرا اطلاعات حساس ممکن است از طریق این رابطها منتقل شوند. در لاراول نیز روشهایی برای افزایش امنیت API ارائه شده است.
محدود کردن دسترسی
میتوانید در لاراول دسترسی به روتها و کنترلرهای API را محدود کنید. با استفاده از میدلورها و کنترل دسترسیها، میتوانید تنظیماتی را انجام داده و فقط به کاربران مجاز اجازه دسترسی به API را بدهید.
برای محدود کردن دسترسی در API لاراول، میتوانید از مکانیزمهای احراز هویت و سطوح دسترسی استفاده کنید. در ادامه، یک مثال ساده برای محدود کردن دسترسی در API لاراول را برای شما توضیح میدهم:
ابتدا باید احراز هویت را تنظیم کنید. میتوانید از passport
، یک پکیج Laravel برای احراز هویت OAuth2 استفاده کنید. با اجرای دستورات زیر، پکیج passport
را نصب و پیکربندی کنید:
composer require laravel/passport
php artisan passport:install
سپس، باید سطح دسترسیها را تعریف کنید. میتوانید در فایل app/Providers/AuthServiceProvider.php
به طور مثال، سطح دسترسی "admin" را تعریف کنید:
use Illuminate\Support\Facades\Gate;
public function boot()
{
$this->registerPolicies();
Gate::define('admin', function ($user) {
return $user->role === 'admin';
});
}
حالا میتوانید در کنترلرها از سطح دسترسی استفاده کنید. برای مثال، فرض کنید میخواهید فقط کاربران با سطح دسترسی "admin" به اطلاعات کاربران دسترسی داشته باشند. میتوانید در کنترلر UserController
، متد index را به صورت زیر تعریف کنید:
use Illuminate\Support\Facades\Gate;
public function index()
{
if (Gate::allows('admin')) {
$users = User::all();
return response()->json($users);
} else {
return response()->json(['error' => 'Access Denied'], 403);
}
}
در این مثال، قبل از بازگرداندن لیست کاربران، با استفاده از Gate::allows('admin')
بررسی میشود که آیا کاربر مورد نظر سطح دسترسی "admin" را دارد یا خیر. در صورتی که دسترسی مجاز باشد، لیست کاربران بازگردانده میشود، در غیر اینصورت پیام خطا با کد 403 برگشت داده میشود.
به این ترتیب، با استفاده از سطوح دسترسی و مکانیزم احراز هویت، میتوانید دسترسی به بخشهای مختلف API را محدود کنید و فقط به کاربران مجاز اجازه دسترسی دهید.
استفاده از توکنهای دسترسی
استفاده از توکنهای دسترسی یکی از روشهای محبوب برای افزایش امنیت API است. با استفاده از توکنهای دسترسی، میتوانید درخواستهای API را معتبر سازید و فقط به درخواستهایی که توکن مناسبی دارند پاسخ دهید.
در لاراول، میتوانید از توکنهای دسترسی برای افزایش امنیت API خود استفاده کنید. توکنهای دسترسی به عنوان رشتهای یکتا عمل میکنند که برای هر درخواست از سمت کاربر صادر میشوند و در درخواستهای بعدی از آن استفاده میشود. به این ترتیب، تنها افرادی که دارای توکن معتبر هستند، به منابع API دسترسی خواهند داشت.
برای استفاده از توکنهای دسترسی در API لاراول، میتوانید از پکیج laravel/passport
استفاده کنید. در ادامه یک مثال ساده از استفاده از توکنهای دسترسی را برای شما توضیح میدهم:
ابتدا پکیج laravel/passport
را نصب کنید:
composer require laravel/passport
سپس دستور زیر را برای ستاپ کردن پکیج اجرا کنید:
php artisan passport:install
در فایل app/Models/User.php
، کلاس User
را با کلاس Laravel\Passport\HasApiTokens
گسترش دهید:
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
// ...
}
در فایل config/auth.php، رانهای مربوط به API را تنظیم کنید:
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
برای ایجاد توکنهای دسترسی برای کاربران، در کنترلر مربوط به ثبت نام و ورود کاربران (به عنوان مثال AuthController
)، متدهای زیر را پیادهسازی کنید:
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
// ...
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('API Token')->accessToken;
return response()->json(['access_token' => $token]);
} else {
return response()->json(['error' => 'Unauthorized'], 401);
}
}
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json(['message' => 'Logged out successfully']);
}
// ...
}
در این مثال، ما برای کاربر معتبر شده، یک توکن دسترسی جدید ایجاد کرده و درخواست ورود را تأیید میکنیم.
حالا میتوانید توکن را در درخواستهای خود استفاده کنید. برای مثال، در کنترلر UserController
، متدهایی را برای مدیریت منابع کاربران پیادهسازی کنید و به آنها میانبر auth:api
را اعمال کنید:
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index(Request $request)
{
$users = User::all();
return response()->json($users);
}
public function show(Request $request, $id)
{
$user = User::find($id);
return response()->json($user);
}
// ...
}
در این مثال، تنها کاربرانی که دارای توکن معتبر هستند، به منابع کاربران دسترسی خواهند داشت.
با استفاده از این روش، میتوانید توکنهای دسترسی را در API لاراول استفاده کنید و امنیت بیشتری برای API خود فراهم کنید.
استفاده از HTTPS
استفاده از پروتکل HTTPS برای ارتباط با API بسیار مهم است. با استفاده از HTTPS، اطلاعات بین کاربر و سرور به صورت رمزنگاری شده منتقل میشوند و از امکانات امنیتی این پروتکل استفاده میشود.
برای استفاده از HTTPS در API لاراول، میتوانید مراحل زیر را دنبال کنید:
در ابتدا، مطمئن شوید که سرور وب شما با HTTPS پیکربندی شده است. برای فعال کردن HTTPS بر روی سرور، باید یک گواهی SSL/TLS معتبر دریافت و نصب کنید.
سپس، مطمئن شوید که آدرس URL API شما با استفاده از //:https
شروع میشود. به عنوان مثال، https://example.com/api/users
.
در صورتی که برای توسعه روی سرور محلی استفاده میکنید، میتوانید از یک سرور توسعه محلی مانند Laravel Valet یا Homestead استفاده کنید که به طور خودکار با HTTPS پیکربندی میشوند.
برای تضمین استفاده از HTTPS در لینکها و منابع استاتیک (مانند تصاویر و فایلهای CSS و JavaScript) در API لاراول، میتوانید از هلپر secure_asset
استفاده کنید. به عنوان مثال:
<img src="{{ secure_asset('images/logo.png') }}" alt="logo">
این هلپر به صورت خودکار لینک را با //:https
شروع میکند.
با انجام این مراحل، API شما با استفاده از HTTPS ارائه میشود و ارتباط بین کلاینت و سرور با امنیت بیشتری صورت میگیرد.
مثال:
برای مثال، فرض کنید که شما یک روت با نام users/
برای دریافت لیست کاربران در API خود دارید. میتوانید آدرس این روت را به صورت زیر تعریف کنید:
Route::get('/users', 'UserController@index')->name('users.index')->middleware('https');
در این مثال، ما از میدلور https
استفاده میکنیم تا مطمئن شویم درخواستها به این روت از طریق HTTPS ارسال شوند. با افزودن میدلور https به روت، لاراول به صورت خودکار مطمئن میشود که درخواستها با استفاده از HTTPS صورت میگیرند
ویژگیهای API در لاراول
لاراول دارای ویژگیهای متنوعی است که در توسعه و استفاده از API بسیار کمککننده هستند.
کش
لاراول امکان کش کردن درخواستهای API را فراهم میکند. با استفاده از کش، میتوانید زمان پاسخدهی را بهبود بخشید و بار سرور را کاهش دهید.استفاده از کشها (Cache) در API لاراول میتواند عملکرد و سرعت پاسخگویی سیستم را بهبود بخشید. با استفاده از کش در API میتوانید نتایج درخواستها را ذخیره کرده و از آنها در درخواستهای بعدی استفاده کنید بدون نیاز به اجرای مجدد کدها و پردازشهای پیچیده. در زیر یک مثال ساده برای استفاده از کش در API لاراول آورده شده است:
ابتدا مطمئن شوید که کش در تنظیمات لاراول فعال شده باشد. برای این کار، به فایل .env مراجعه کنید و مطمئن شوید که مقدار CACHE_DRIVER
به file
یا redis
تنظیم شده است.
در کنترلر مربوط به روت مورد نظر خود، متدها و عملکردهای لازم را پیادهسازی کنید. برای مثال، فرض کنید میخواهید لیست کاربران را بازیابی کنید. میتوانید کد زیر را در نظر بگیرید:
public function index()
{
$users = Cache::remember('users', 3600, function () {
return User::all();
});
return response()->json($users);
}
در این مثال، ما از متد remember
از کلاس Cache استفاده میکنیم. با استفاده از این متد، لیست کاربران را در کش ذخیره میکنیم و اگر درخواستی برای دریافت لیست کاربران صادر شود، ابتدا به کش مراجعه میکنیم و در صورت وجود اطلاعات در کش، آنها را بازیابی میکنیم بدون اجرای مجدد کوئری به پایگاه داده.
در مثال بالا، users
نام کلید کش است که برای ذخیره لیست کاربران استفاده شده است. همچنین، عدد 3600 به معنای زمان انقضای کش است (در اینجا 3600 ثانیه یا یک ساعت). بعد از انقضای زمان تعیین شده، کش از بین میرود و درخواست بعدی مجدداً به پایگاه داده ارسال میشود.
با انجام این مراحل، لاراول به صورت خودکار از کش استفاده میکند و پاسخها را در کش ذخیره میکند. این باعث بهبود عملکرد و کاهش زمان پاسخگویی API میشود. البته، برای استفاده بهینه از کش در API، میتوانید مواردی مانند اعتبارسنجی (Validation) و شرایط خاص برای ذخیرهسازی در کش را در نظر بگیرید.
ولیدیشن
ولیدیشن به شما امکان میدهد ورودیهای دریافتی درخواستهای API را بررسی کرده و از صحت آنها اطمینان حاصل کنید. لاراول قابلیتهای قدرتمندی برای ولیدیشن دادهها در API ارائه میدهد.
اعتبارسنجی (Validation) در API لاراول بسیار مهم است و به شما کمک میکند ورودیهای دریافتی از کاربر را بررسی و اعتبارسنجی کنید تا از دادههای نامناسب و ناخواسته جلوگیری کنید. در زیر توضیح میدهم که چگونه میتوانید اعتبارسنجی را در API لاراول انجام دهید:
ابتدا در کنترلر مربوط به روت خود، اعتبارسنجی مورد نیاز را تعریف کنید. میتوانید از کلاس Validator در لاراول استفاده کنید. برای مثال، فرض کنید میخواهید درخواست برای ایجاد یک کاربر را اعتبارسنجی کنید. میتوانید کد زیر را در نظر بگیرید:
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:8',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// کدهای دیگر برای ذخیره کاربر در پایگاه داده
return response()->json(['message' => 'کاربر با موفقیت ایجاد شد'], 201);
}
در این مثال، از Validator استفاده میکنیم تا ورودیهای درخواست (مانند نام، ایمیل و رمزعبور) را اعتبارسنجی کنیم. در صورتی که اعتبارسنجی با موفقیت عبور نکند، خطاهای مربوطه را به صورت JSON در پاسخ بازگردانده و کد وضعیت 422 (Unprocessable Entity
) را برگردانده میکنیم.
در مثال بالا، برخی قوانین اعتبارسنجی یا همان rule هایی مانند required، string، max و unique را مشاهده میکنید. شما میتوانید قوانین مورد نیاز خود را بر اساس نیازهای خود تعریف کنید. برای اطلاعات بیشتر درباره قوانین اعتبارسنجی در لاراول، به مستندات رسمی لاراول مراجعه کنید.
با استفاده از اعتبارسنجی در API لاراول، میتوانید ورودیهای دریافتی را به صورت دقیق و معتبر بررسی کنید و پاسخهای مناسب برای خطاها ارسال کنید. این به شما کمک میکند تا از ورودیهای نامعتبر و نادرست جلوگیری کنید و برنامه خود را از حوادث ناخوشایند و خرابیها محافظت کنید.
آزمون واحد Unit Testing
لاراول به شما امکان میدهد تا آزمونهای واحد برای API خود ایجاد کنید. با استفاده از یونیت تست، میتوانید اطمینان حاصل کنید که رابطهای برنامهنویسی شما به درستی عمل میکنند و به نتایج مورد انتظار میرسید.استفاده از یونیت تست میتوانید خطاها و مشکلات محتمل در کد خود را شناسایی کنید و بهبود کیفیت نرمافزار خود را تضمین کنید. در زیر توضیح میدهم که چگونه میتوانید آزمون واحد را در API لاراول انجام دهید:
ابتدا محیط تست را پیکربندی کنید. برای این کار، در فایل env.
خود لاراول، مقدار APP_ENV
را به testing
تنظیم کنید.
در پوشه tests
، فایل جدیدی با نام ExampleTest.php
ایجاد کنید یا از فایل مثال موجود استفاده کنید. در این فایل، میتوانید یونیت تست خود را ایجاد کنید. برای مثال، فرض کنید میخواهید تستی برای اعتبارسنجی ایجاد کاربر انجام دهید. میتوانید کد زیر را در نظر بگیرید:
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
public function test_create_user_validation()
{
$response = $this->postJson('/api/users', [
'name' => '',
'email' => 'example@example.com',
'password' => 'password',
]);
$response->assertStatus(422)
->assertJsonValidationErrors(['name']);
}
}
در این مثال، ما از کلاس TestCase
ارثبری کرده و از RefreshDatabase
استفاده میکنیم تا پایگاه داده را قبل از هر تست مجدداً بازسازی کنیم. سپس تست test_create_user_validation
را تعریف میکنیم که بررسی میکند آیا در صورت ارسال اطلاعات ناصحیح به API برای ایجاد کاربر، اعتبارسنجی صحیح انجام میشود یا خیر.
در این تست، اطلاعات نامعتبری برای نام کاربر ارسال میشود و ما انتظار داریم که پاسخ با کد وضعیت 422 (Unprocessable Entity) و خطای مربوطه برگردانده شود.
با اجرای دستور php artisan test
میتوانید تمام تستهای واحد خود را اجرا کنید و نتایج را بررسی کنید. لاراول ابزارهای مفیدی را برای آزمون واحد فراهم کرده است که به شما امکاناتی مانند ایجاد دادههای آزمایشی، ارسال درخواستها به API، بررسی پاسخها و غیره را میدهد.
با استفاده از آزمون واحد در API لاراول، میتوانید از عملکرد صحیح و قابلیت اطمینان کد خود اطمینان حاصل کنید و از وجود خطاهای ناخواسته جلوگیری کنید. این به شما کمک میکند تا نرمافزار خود را بهبود دهید و بهترین تجربه کاربری را به کاربرانتان ارائه دهید.
نتیجهگیری
API در لاراول ابزاری قدرتمند است که برنامهنویسان را قادر میسازد رابطهای برنامهنویسی قدرتمندی بسازند و از قابلیتهای برنامهها و سرویسهای دیگر استفاده کنند. با رعایت اصول امنیتی و استفاده از ویژگیهای لاراول، میتوانید APIهای امن و کارآمدی را بسازید و از آنها بهرهبرداری کنید.