سی ام اس نویسسی ام اس نویسیاد بگیر، سیستم خودتو بنویس
مجلهتماس با ما
سی ام اس نویسسی ام اس نویس

CMS نویس مرجعی برای آموزش برنامه نویسی وب و PHP، توسعه افزونه‌های اختصاصی وردپرس، طراحی ورک‌فلو و اتوماسیون با n8n و توسعه CMS های اختصاصی است. هدف ما ارائه آموزش‌های کاربردی و راهکارهای حرفه‌ای برای توسعه‌دهندگان، کسب‌وکارها و علاقه‌مندان به دنیای برنامه‌نویسی است.

پیوندهای سریع
محصولات فیزیکیمحصولات دیجیتالدوره‌های آموزشی
سی ام اس نویس
مجله سی ام اس نویستماس با ماپنل کاربری
سی ام اس نویس — تمامی حقوق برای سی ام اس نویس محفوظ است. © 1406 تماس با ما09307711941
آموزش ساخت API برای اپلیکیشن موبایل با Laravel؛ از ورود تا دریافت اطلاعات کاربر

آموزش ساخت API برای اپلیکیشن موبایل با Laravel؛ از ورود تا دریافت اطلاعات کاربر

ممدیر کل سیستم ۲۴ مهر ۱۴۰۵ ۲۰ دقیقه مطالعه ۱ بازدید
آموزش ساخت API برای اپلیکیشن موبایل با Laravel؛ از ورود تا دریافت اطلاعات کاربر

امروزه بسیاری از اپلیکیشن‌های موبایل برای مدیریت کاربران، دریافت اطلاعات، ثبت سفارش، پردازش پرداخت و ارتباط با سرور به یک API نیاز دارند. اگر بک‌اند برنامه را با Laravel توسعه می‌دهید، می‌توانید با استفاده از قابلیت‌های این فریم‌ورک یک API استاندارد طراحی کنید تا اپلیکیشن‌های اندروید، iOS یا Flutter از طریق درخواست‌های HTTP با سرور ارتباط برقرار کنند.

در این آموزش، یک API کاربردی با Laravel می‌سازیم که امکان ثبت‌نام کاربران، ورود با ایمیل و رمز عبور، دریافت اطلاعات کاربر واردشده و خروج از حساب را فراهم می‌کند. برای مدیریت توکن‌های احراز هویت از Laravel Sanctum استفاده خواهیم کرد.

در پایان مقاله، می‌توانید API را با ابزاری مانند Postman یا Talend API Tester آزمایش کنید و از همین ساختار برای توسعه قابلیت‌های دیگر اپلیکیشن خود استفاده کنید.

API چیست و چرا برای اپلیکیشن موبایل به آن نیاز داریم؟

API مخفف Application Programming Interface است و راهی استاندارد برای ارتباط میان نرم‌افزارها فراهم می‌کند.

برای مثال، فرض کنید یک اپلیکیشن فروشگاهی با Flutter طراحی کرده‌اید و بک‌اند آن با Laravel توسعه داده شده است. اپلیکیشن برای نمایش محصولات باید اطلاعات را از سرور دریافت کند. برای ثبت سفارش نیز باید اطلاعات سبد خرید را به سرور ارسال کند.

در چنین معماری‌ای، Laravel مسئول پردازش درخواست‌ها، ارتباط با دیتابیس، بررسی مجوزها و برگرداندن پاسخ است؛ اپلیکیشن موبایل نیز اطلاعات دریافتی را به کاربر نمایش می‌دهد.

ساختار کلی ارتباط به این شکل است:


اپلیکیشن موبایل

       |

       | HTTP Request

       v

Laravel REST API

       |

       | اعتبارسنجی و پردازش

       v

     Database

       |

       | نتیجه درخواست

       v

Laravel REST API

       |

       | JSON Response

       v

اپلیکیشن موبایل

این معماری مزیت مهمی دارد: می‌توانید از یک بک‌اند مشترک برای چند کلاینت مختلف استفاده کنید؛ مثلاً اپلیکیشن اندروید، اپلیکیشن iOS و یک وب‌سایت.

در این پروژه چه APIهایی می‌سازیم؟

برای اینکه آموزش عملی باشد، APIهای زیر را پیاده‌سازی می‌کنیم:

متد HTTPمسیرکاربردنیاز به ورود
POST/api/registerثبت‌نام کاربرخیر
POST/api/loginورود کاربر و دریافت توکنخیر
GET/api/userدریافت اطلاعات کاربر جاریبله
POST/api/logoutخروج و لغو توکن فعلیبله

در این پروژه از توکن‌های Bearer استفاده می‌کنیم. پس از ورود موفق، سرور یک توکن به اپلیکیشن می‌دهد و اپلیکیشن آن را در درخواست‌های محافظت‌شده ارسال می‌کند.

مرحله اول: آماده‌سازی پروژه Laravel

ابتدا باید یک پروژه Laravel داشته باشید. اگر هنوز پروژه‌ای ایجاد نکرده‌اید، می‌توانید با دستور زیر یک پروژه جدید بسازید:


composer create-project laravel/laravel mobile-api

سپس وارد پوشه پروژه شوید:


cd mobile-api

اتصال دیتابیس را در فایل .env تنظیم کنید. برای مثال، تنظیمات MySQL می‌تواند به شکل زیر باشد:


DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=mobile_api

DB_USERNAME=root

DB_PASSWORD=

نام دیتابیس، نام کاربری و رمز عبور را مطابق محیط خودتان تغییر دهید.

اگر از SQLite یا دیتابیس دیگری استفاده می‌کنید، تنظیمات اتصال را متناسب با همان دیتابیس وارد کنید.

مرحله دوم: نصب Laravel Sanctum و فعال‌سازی API Routing

Laravel Sanctum ابزار رسمی Laravel برای مدیریت توکن‌های احراز هویت و برخی سناریوهای احراز هویت SPA است. برای اپلیکیشن موبایل، قابلیت توکن‌های شخصی Sanctum گزینه مناسبی محسوب می‌شود.

در نسخه‌های جدید Laravel، از جمله Laravel 12 و 13، می‌توانید از دستور زیر برای نصب قابلیت‌های API و Sanctum استفاده کنید:


php artisan install:api

این دستور در پروژه‌های پشتیبانی‌شده، Sanctum را نصب و تنظیمات لازم را انجام می‌دهد و فایل routes/api.php را ایجاد می‌کند. <Cite refs={["turn765931search0","turn765931search2"]}/>

اگر از نسخه قدیمی‌تر Laravel استفاده می‌کنید یا دستور بالا در نسخه شما وجود ندارد، باید روش نصب متناسب با همان نسخه را از مستندات رسمی بررسی کنید.

پس از نصب، Migrationهای پروژه را اجرا کنید:


php artisan migrate

Sanctum جدولی برای ذخیره توکن‌های دسترسی ایجاد می‌کند که معمولاً نام آن personal_access_tokens است.

نکته: اگر Migrationهای پروژه قبلاً اجرا شده‌اند، لازم نیست آن‌ها را دوباره اجرا کنید. فقط مطمئن شوید Migration مربوط به Sanctum نیز اجرا شده باشد.

مرحله سوم: آماده‌سازی مدل User برای صدور توکن

برای اینکه بتوانیم از قابلیت توکن‌های Sanctum استفاده کنیم، باید Trait مربوط به آن را به مدل کاربران اضافه کنیم.

فایل زیر را باز کنید:

app/Models/User.php

در بالای فایل، این کلاس را وارد کنید:


use Laravel\Sanctum\HasApiTokens;

سپس Trait را به مدل اضافه کنید:


use HasApiTokens;

برای مثال، ساختار مدل می‌تواند به شکل زیر باشد:


<?php



namespace App\Models;



use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Notifications\Notifiable;

use Laravel\Sanctum\HasApiTokens;



class User extends Authenticatable

{

    use HasApiTokens, HasFactory, Notifiable;



    protected $fillable = [

        'name',

        'email',

        'password',

    ];



    protected $hidden = [

        'password',

        'remember_token',

    ];

}

اگر مدل شما از قبل Traitها یا تنظیمات دیگری دارد، آن‌ها را حذف نکنید. فقط HasApiTokens را اضافه کنید و تنظیمات موجود را حفظ کنید.

این Trait امکان صدور و مدیریت توکن‌های مربوط به هر کاربر را فراهم می‌کند.

همچنین فیلد password باید در دیتابیس به‌اندازه کافی ظرفیت داشته باشد. در Migration پیش‌فرض Laravel، این ستون به‌صورت مناسب تعریف شده است.

مرحله چهارم: ساخت کنترلر API

برای اینکه منطق ثبت‌نام، ورود، دریافت اطلاعات و خروج از Routeها جدا باشد، یک کنترلر اختصاصی ایجاد می‌کنیم.

در ترمینال اجرا کنید:


php artisan make:controller Api/AuthController

فایل کنترلر در مسیر زیر ایجاد می‌شود:

app/Http/Controllers/Api/AuthController.php

کد زیر را در آن قرار دهید:


<?php



namespace App\Http\Controllers\Api;



use App\Http\Controllers\Controller;

use App\Models\User;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Hash;

use Illuminate\Validation\ValidationException;



class AuthController extends Controller

{

    /**

     * ثبت‌نام کاربر جدید

     */

    public function register(Request $request)

    {

        $validated = $request->validate([

            'name' => ['required', 'string', 'max:255'],

            'email' => [

                'required',

                'email',

                'max:255',

                'unique:users,email',

            ],

            'password' => [

                'required',

                'string',

                'min:8',

                'confirmed',

            ],

            'device_name' => [

                'required',

                'string',

                'max:100',

            ],

        ]);



        $user = User::create([

            'name' => $validated['name'],

            'email' => $validated['email'],

            'password' => Hash::make($validated['password']),

        ]);



        $token = $user->createToken(

            $validated['device_name']

        );



        return response()->json([

            'message' => 'ثبت‌نام با موفقیت انجام شد.',

            'data' => [

                'user' => [

                    'id' => $user->id,

                    'name' => $user->name,

                    'email' => $user->email,

                ],

                'token' => $token->plainTextToken,

                'token_type' => 'Bearer',

            ],

        ], 201);

    }



    /**

     * ورود کاربر

     */

    public function login(Request $request)

    {

        $validated = $request->validate([

            'email' => ['required', 'email'],

            'password' => ['required', 'string'],

            'device_name' => [

                'required',

                'string',

                'max:100',

            ],

        ]);



        $user = User::where(

            'email',

            $validated['email']

        )->first();



        if (

            ! $user ||

            ! Hash::check(

                $validated['password'],

                $user->password

            )

        ) {

            throw ValidationException::withMessages([

                'email' => [

                    'اطلاعات ورود واردشده صحیح نیست.',

                ],

            ]);

        }



        $token = $user->createToken(

            $validated['device_name']

        );



        return response()->json([

            'message' => 'ورود با موفقیت انجام شد.',

            'data' => [

                'user' => [

                    'id' => $user->id,

                    'name' => $user->name,

                    'email' => $user->email,

                ],

                'token' => $token->plainTextToken,

                'token_type' => 'Bearer',

            ],

        ]);

    }



    /**

     * دریافت اطلاعات کاربر جاری

     */

    public function user(Request $request)

    {

        $user = $request->user();



        return response()->json([

            'data' => [

                'id' => $user->id,

                'name' => $user->name,

                'email' => $user->email,

            ],

        ]);

    }



    /**

     * خروج از حساب و لغو توکن فعلی

     */

    public function logout(Request $request)

    {

        $request->user()

            ->currentAccessToken()

            ->delete();



        return response()->json([

            'message' => 'خروج با موفقیت انجام شد.',

        ]);

    }

}

در ادامه، منطق این کنترلر را بررسی می‌کنیم.

متد register؛ ثبت‌نام کاربر

در این متد، اطلاعات ورودی اعتبارسنجی می‌شوند:

  • نام باید وارد شود.
  • ایمیل باید معتبر و یکتا باشد.
  • رمز عبور باید حداقل هشت کاراکتر داشته باشد.
  • مقدار تأیید رمز عبور باید با رمز اصلی مطابقت داشته باشد.
  • نام دستگاه نیز باید مشخص شود.

قانون confirmed انتظار دارد فیلدی با نام password_confirmation در درخواست وجود داشته باشد.

پس از اعتبارسنجی، کاربر در دیتابیس ذخیره می‌شود. رمز عبور با Hash::make() هش می‌شود و هرگز به شکل متن ساده در دیتابیس قرار نمی‌گیرد.

سپس با createToken() توکن جدیدی ساخته می‌شود. مقدار plainTextToken فقط در زمان ایجاد توکن قابل دریافت است و باید همان زمان به کلاینت تحویل داده شود. Sanctum مقدار توکن را به‌صورت هش‌شده در دیتابیس نگهداری می‌کند. <Cite refs={["turn765931search0","turn609554view0"]}/>

متد login؛ ورود کاربر

در این متد، ابتدا کاربر بر اساس ایمیل جست‌وجو می‌شود. سپس با Hash::check() رمز عبور واردشده با هش ذخیره‌شده مقایسه می‌شود.

اگر اطلاعات صحیح باشند، یک توکن جدید برای دستگاه ایجاد می‌شود.

پارامتر device_name می‌تواند عبارتی مانند android-phone یا iphone-app باشد. این نام به مدیریت توکن‌های کاربر کمک می‌کند و به‌تنهایی هویت واقعی دستگاه را اثبات نمی‌کند.

متد user؛ دریافت اطلاعات کاربر

در درخواست‌های محافظت‌شده، متد زیر کاربر احراز هویت‌شده را برمی‌گرداند:


$request->user()

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

در پاسخ نیز فقط اطلاعات عمومی کاربر را برمی‌گردانیم؛ نه رمز عبور یا سایر اطلاعات حساس را.

متد logout؛ خروج از حساب

در این پروژه، خروج به معنی لغو توکن فعلی است:


$request->user()

    ->currentAccessToken()

    ->delete();

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

اگر کاربر روی چند دستگاه وارد شده باشد، این روش فقط توکن درخواست جاری را لغو می‌کند؛ سایر توکن‌ها همچنان فعال خواهند بود، مگر اینکه جداگانه لغو شوند.

مرحله پنجم: تعریف Routeهای API

اکنون باید مسیرهای API را در فایل زیر تعریف کنیم:

routes/api.php

کد زیر را در فایل قرار دهید:


<?php



use Illuminate\Support\Facades\Route;

use App\Http\Controllers\Api\AuthController;



Route::post('/register', [

    AuthController::class,

    'register',

])->middleware('throttle:5,1');



Route::post('/login', [

    AuthController::class,

    'login',

])->middleware('throttle:5,1');



Route::middleware('auth:sanctum')->group(function () {

    Route::get('/user', [

        AuthController::class,

        'user',

    ]);



    Route::post('/logout', [

        AuthController::class,

        'logout',

    ]);

});

اگر فایل از قبل Routeهای دیگری دارد، آن‌ها را حذف نکنید و مسیرهای جدید را به فایل موجود اضافه کنید.

چرا از auth:sanctum استفاده می‌کنیم؟

این Middleware بررسی می‌کند که درخواست دارای احراز هویت معتبر باشد.

اگر درخواست از یک اپلیکیشن موبایل ارسال شده باشد، Sanctum می‌تواند توکن Bearer موجود در هدر Authorization را بررسی کند.

اگر توکن معتبر نباشد یا ارسال نشده باشد، کاربر به مسیر محافظت‌شده دسترسی نخواهد داشت.

در درخواست‌های API که هدر Accept: application/json دارند، Laravel معمولاً خطاهای اعتبارسنجی و احراز هویت را به‌صورت پاسخ JSON برمی‌گرداند. <Cite refs={["turn765931search0","turn765931search2"]}/>

Rate Limiting چیست؟

در این پروژه، روی مسیرهای ورود و ثبت‌نام از Middleware زیر استفاده کرده‌ایم:


->middleware('throttle:5,1');

این تنظیم، در حالت معمول، تعداد درخواست‌های مجاز را به پنج درخواست در هر دقیقه برای کلید محدودسازی پیش‌فرض محدود می‌کند.

این مقدار صرفاً برای نمونه آموزشی است و باید بر اساس نیاز واقعی پروژه تنظیم شود. در پروژه عملیاتی بهتر است سیاست محدودسازی درخواست، رفتار کاربران، IP، حساب کاربری و نحوه مدیریت درخواست‌های ناموفق به‌دقت طراحی شود.

مرحله ششم: بررسی Routeها

پس از تعریف مسیرها، دستور زیر را اجرا کنید:


php artisan route:list --path=api

باید مسیرهای مربوط به ثبت‌نام، ورود، دریافت اطلاعات کاربر و خروج را مشاهده کنید.

در پروژه‌های جدید Laravel، فایل routes/api.php به‌طور خودکار پیشوند /api می‌گیرد. بنابراین اگر در این فایل مسیر /login را تعریف کرده باشید، آدرس کامل آن به‌صورت /api/login خواهد بود.

این پیشوند را دوباره داخل خود Route وارد نکنید؛ مگر اینکه عمداً ساختار متفاوتی تنظیم کرده باشید.

مرحله هفتم: تست ثبت‌نام با Postman یا Talend API Tester

اکنون می‌توانیم API را آزمایش کنیم.

فرض می‌کنیم برنامه روی آدرس زیر اجرا می‌شود:

http://127.0.0.1:8000

در محیط توسعه می‌توانید سرور را با دستور زیر اجرا کنید:


php artisan serve

در محیط عملیاتی، از دامنه و HTTPS واقعی خود استفاده کنید.

درخواست اول: ثبت‌نام

تنظیمات درخواست:

  • Method: POST
  • URL: http://127.0.0.1:8000/api/register
  • Content-Type: application/json
  • Accept: application/json

در بخش Body، نوع JSON را انتخاب کنید و اطلاعات زیر را ارسال کنید:


{

    "name": "Ali Ahmadi",

    "email": "ali@example.com",

    "password": "StrongPass123!",

    "password_confirmation": "StrongPass123!",

    "device_name": "android-phone"

}

ایمیل نمونه را با ایمیلی که هنوز در دیتابیس ثبت نشده است جایگزین کنید.

در صورت موفقیت، پاسخ با وضعیت HTTP 201 Created برگردانده می‌شود و شامل اطلاعات عمومی کاربر و توکن دسترسی خواهد بود.

نکته امنیتی: توکن برگشتی یک مقدار محرمانه است. آن را در اسکرین‌شات عمومی، گزارش قابل دسترس یا کد منتشرشده قرار ندهید.

درخواست دوم: ورود

تنظیمات:

  • Method: POST
  • URL: http://127.0.0.1:8000/api/login
  • Content-Type: application/json
  • Accept: application/json

در Body این اطلاعات را ارسال کنید:


{

    "email": "ali@example.com",

    "password": "StrongPass123!",

    "device_name": "android-phone"

}

در صورت صحیح بودن اطلاعات، پاسخ شامل توکن جدید خواهد بود.

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

درخواست سوم: دریافت اطلاعات کاربر

اکنون باید توکن دریافتی را در هدر درخواست قرار دهید.

تنظیمات:

  • Method: GET
  • URL: http://127.0.0.1:8000/api/user

هدرهای زیر را اضافه کنید:


Accept: application/json

Authorization: Bearer YOUR_ACCESS_TOKEN

به‌جای YOUR_ACCESS_TOKEN مقدار واقعی توکن را قرار دهید.

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

درخواست چهارم: خروج از حساب

تنظیمات:

  • Method: POST
  • URL: http://127.0.0.1:8000/api/logout

هدرها:


Accept: application/json

Authorization: Bearer YOUR_ACCESS_TOKEN

در صورت موفقیت، توکن فعلی حذف می‌شود.

پس از آن، همان توکن را مجدداً برای درخواست /api/user استفاده کنید. انتظار می‌رود درخواست دیگر احراز هویت نشود.

مرحله هشتم: ارسال درخواست از اپلیکیشن موبایل

پس از آماده شدن API، اپلیکیشن موبایل باید بتواند درخواست‌ها را به سرور ارسال کند.

فرقی نمی‌کند اپلیکیشن با Flutter، Kotlin، Swift یا فناوری دیگری ساخته شده باشد؛ اصول ارتباط با API مشابه است:

  1. درخواست HTTP ارسال می‌شود.
  2. داده‌ها معمولاً با فرمت JSON منتقل می‌شوند.
  3. سرور درخواست را اعتبارسنجی و پردازش می‌کند.
  4. نتیجه با کد وضعیت HTTP و پاسخ JSON برگردانده می‌شود.
  5. اپلیکیشن نتیجه را بررسی و در رابط کاربری نمایش می‌دهد.

برای مثال، پس از ورود موفق، اپلیکیشن توکن را به شکل امن نگهداری می‌کند و هنگام درخواست اطلاعات کاربر، آن را در هدر Authorization قرار می‌دهد.

نمونه مفهومی درخواست:


GET /api/user HTTP/1.1

Host: api.example.com

Accept: application/json

Authorization: Bearer YOUR_ACCESS_TOKEN

در این مثال، api.example.com دامنه نمونه است و باید با دامنه واقعی API جایگزین شود.

نکته مهم: توکن را داخل URL، پارامترهای Query String یا پیام‌های خطای قابل مشاهده قرار ندهید. هدر Authorization روش معمول ارسال توکن Bearer است.

مرحله نهم: مدیریت پاسخ‌ها و خطاهای API

یک API استاندارد باید پاسخ قابل پیش‌بینی داشته باشد تا اپلیکیشن بتواند بر اساس آن تصمیم بگیرد.

وضعیت‌های مهم HTTP در این پروژه عبارت‌اند از:

کد وضعیتمفهوممثال
200 OKدرخواست موفقدریافت اطلاعات کاربر
201 Createdمنبع جدید ایجاد شدهثبت‌نام موفق
401 Unauthorizedاحراز هویت انجام نشده یا معتبر نیستتوکن نامعتبر
403 Forbiddenکاربر احراز هویت شده، اما مجوز لازم را نداردعملیات غیرمجاز
422 Unprocessable Contentداده‌های ورودی معتبر نیستندایمیل نامعتبر یا فیلد ناقص
429 Too Many Requestsتعداد درخواست‌ها از حد مجاز بیشتر شدهمحدودیت ورود

Laravel معمولاً خطاهای Validation را با وضعیت 422 و جزئیات فیلدهای نامعتبر برمی‌گرداند، مشروط بر اینکه درخواست به‌عنوان درخواست JSON شناخته شود.

برای مثال، اگر رمز عبور کوتاه باشد، پاسخ می‌تواند مشابه ساختار زیر باشد:


{

    "message": "The given data was invalid.",

    "errors": {

        "password": [

            "The password field must be at least 8 characters."

        ]

    }

}

متن دقیق پیام‌ها ممکن است بر اساس زبان و تنظیمات برنامه متفاوت باشد.

برای تجربه کاربری بهتر، می‌توانید پیام‌های اعتبارسنجی را فارسی کنید و ساختار پاسخ‌های API را در سراسر پروژه یکسان نگه دارید.

مرحله دهم: نکات امنیتی مهم در ساخت API موبایل

ساخت API تنها به تعریف چند Route و بازگرداندن JSON محدود نمی‌شود. اگر قرار است API در یک اپلیکیشن واقعی استفاده شود، باید از ابتدا اصول امنیتی را رعایت کنید.

۱. از HTTPS استفاده کنید

در محیط عملیاتی، API باید از طریق HTTPS در دسترس باشد تا اطلاعات در مسیر انتقال رمزگذاری شوند.

ارسال رمز عبور یا توکن از طریق ارتباط HTTP ناامن می‌تواند اطلاعات کاربران را در معرض خطر قرار دهد.

۲. توکن را در اپلیکیشن امن نگهداری کنید

توکن احراز هویت را در فایل‌های عمومی، تنظیمات قابل انتشار یا فضای ذخیره‌سازی ناامن قرار ندهید.

از قابلیت‌های امن سیستم‌عامل استفاده کنید؛ برای مثال، Keychain در iOS و Android Keystore همراه با راهکار ذخیره‌سازی امن مناسب در Android.

۳. برای توکن‌ها سیاست انقضا تعریف کنید

توکن‌های Sanctum به‌صورت پیش‌فرض تا زمان لغو شدن معتبر می‌مانند، مگر اینکه انقضا برای آن‌ها پیکربندی شده باشد. <Cite refs={["turn765931search0","turn609554view0"]}/>

برای پروژه واقعی، بهتر است سیاست مشخصی برای طول عمر توکن‌ها داشته باشید. همچنین می‌توانید توکن‌های منقضی‌شده را با دستور مربوط به پاک‌سازی توکن‌های Sanctum حذف کنید.

۴. توکن هر دستگاه را جداگانه مدیریت کنید

در این پروژه، هنگام ورود هر دستگاه یک توکن جدید ایجاد می‌شود. این کار امکان مدیریت نشست‌های مختلف را فراهم می‌کند.

برای مثال، اگر کاربر گوشی خود را گم کند، می‌توانید امکان لغو توکن همان دستگاه را از پنل حساب کاربری فراهم کنید؛ بدون اینکه لزوماً تمام دستگاه‌های دیگر از حساب خارج شوند.

۵. اطلاعات حساس را در پاسخ API برنگردانید

رمز عبور، هش رمز عبور، توکن‌های خصوصی و اطلاعات حساس داخلی نباید در پاسخ‌های عمومی API قرار بگیرند.

در مثال این مقاله، فقط شناسه، نام و ایمیل کاربر را برمی‌گردانیم. در پروژه‌های بزرگ‌تر می‌توانید از API Resource برای کنترل ساختار خروجی استفاده کنید.

۶. احراز هویت را با مجوزدهی اشتباه نگیرید

داشتن توکن معتبر به این معنی نیست که کاربر اجازه دسترسی به تمام اطلاعات را دارد.

برای مثال، اگر API سفارش‌ها را ارائه می‌دهد، باید علاوه بر احراز هویت، بررسی کنید سفارش متعلق به همان کاربر باشد. در غیر این صورت، مهاجم ممکن است با تغییر شناسه سفارش به اطلاعات دیگران دسترسی پیدا کند.

۷. از Rate Limiting استفاده کنید

محدودسازی درخواست‌ها برای کاهش حملات خودکار، تلاش‌های مکرر ورود و مصرف بیش از حد منابع ضروری است.

محدودیت‌ها را برای مسیرهای حساس مانند ورود، ثبت‌نام، ارسال کد تأیید و بازیابی رمز عبور با سیاست متناسب تنظیم کنید.

۸. اعتبارسنجی سمت سرور را جدی بگیرید

هر داده‌ای که از اپلیکیشن دریافت می‌کنید باید در سرور اعتبارسنجی شود. حتی اگر فرم موبایل مقادیر را بررسی می‌کند، نمی‌توان به آن اعتماد کرد؛ زیرا درخواست‌ها ممکن است مستقیماً و با ابزارهای دیگر ارسال شوند.

مرحله یازدهم: تفاوت Laravel Sanctum و Passport چیست؟

Laravel دو ابزار شناخته‌شده برای احراز هویت API دارد: Sanctum و Passport.

Laravel Sanctum برای بسیاری از APIهای معمول، اپلیکیشن‌های موبایل و SPAها انتخاب ساده و مناسبی است. در این آموزش از همین ابزار استفاده کردیم.

Laravel Passport برای سناریوهایی مناسب است که به امکانات کامل پروتکل OAuth2 نیاز دارند؛ برای مثال، در بعضی سامانه‌هایی که چند کلاینت و جریان‌های مجوزدهی استاندارد دارند.

برای یک اپلیکیشن موبایل معمولی که به ثبت‌نام، ورود و دریافت توکن نیاز دارد، اغلب لازم نیست پیچیدگی OAuth2 را از ابتدا وارد پروژه کنید. انتخاب نهایی باید بر اساس معماری و نیازهای امنیتی انجام شود. <Cite refs={["turn765931search1","turn765931search5"]}/>

مرحله دوازدهم: توسعه API برای قابلیت‌های بیشتر

پس از پیاده‌سازی احراز هویت، می‌توانید APIهای دیگری را برای اپلیکیشن توسعه دهید.

برای مثال:

  • دریافت فهرست محصولات
  • مشاهده جزئیات محصول
  • ثبت و پیگیری سفارش
  • مدیریت پروفایل کاربر
  • بارگذاری تصویر
  • ارسال اعلان
  • دریافت سوابق خرید
  • مدیریت علاقه‌مندی‌ها
  • اتصال به درگاه پرداخت
  • ارسال و دریافت پیام‌های پشتیبانی

در این مرحله بهتر است برای خروجی منابع از API Resource، برای اعتبارسنجی پیچیده از Form Request و برای کنترل دسترسی از Policy یا Gate استفاده کنید.

همچنین اگر نسخه‌بندی API برایتان اهمیت دارد، می‌توانید ساختار مسیرها را به شکل /api/v1/... طراحی کنید. چون Laravel به‌صورت پیش‌فرض پیشوند /api را اعمال می‌کند، باید فقط بخش v1 را در مسیرهای تعریف‌شده اضافه کنید.

پرسش‌های متداول

آیا با Laravel می‌توان برای اپلیکیشن اندروید و iOS API ساخت؟

بله. Laravel می‌تواند بک‌اند مشترکی برای اپلیکیشن‌های اندروید و iOS فراهم کند. اپلیکیشن‌ها از طریق درخواست‌های HTTP به API متصل می‌شوند و معمولاً اطلاعات را با فرمت JSON دریافت می‌کنند.

آیا برای ساخت API در Laravel باید از Sanctum استفاده کنیم؟

خیر، اما Sanctum برای بسیاری از پروژه‌هایی که به احراز هویت توکنی نیاز دارند گزینه مناسبی است. انتخاب ابزار احراز هویت به نوع کلاینت، نیاز امنیتی و معماری سیستم بستگی دارد.

توکن Bearer چیست؟

توکن Bearer مقداری است که کلاینت در هدر Authorization ارسال می‌کند. سرور با بررسی اعتبار توکن، هویت کاربر را مشخص می‌کند. هر شخصی که به توکن دسترسی پیدا کند ممکن است بتواند از آن استفاده کند؛ بنابراین نگهداری امن آن ضروری است.

آیا بعد از خروج، توکن کاربر حذف می‌شود؟

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

آیا می‌توان API را با Postman آزمایش کرد؟

بله. می‌توانید درخواست‌های POST برای ثبت‌نام و ورود و درخواست GET برای دریافت اطلاعات کاربر ارسال کنید. برای مسیرهای محافظت‌شده باید توکن را در هدر Authorization قرار دهید.

چرا API به‌جای JSON صفحه ورود HTML نمایش می‌دهد؟

این رفتار ممکن است زمانی رخ دهد که درخواست به‌عنوان درخواست JSON شناخته نشود یا تنظیمات مسیر و Middlewareها مناسب نباشند. هدر Accept: application/json را ارسال کنید و مطمئن شوید Route در فایل routes/api.php تعریف شده است.

جمع‌بندی

در این مقاله یاد گرفتیم چگونه با Laravel و Sanctum یک API برای اپلیکیشن موبایل بسازیم. ابتدا API Routing و Sanctum را آماده کردیم، سپس مدل User را برای صدور توکن تنظیم کردیم و کنترلر مربوط به ثبت‌نام، ورود، دریافت اطلاعات کاربر و خروج را ساختیم.

در ادامه، Routeهای عمومی و محافظت‌شده را تعریف کردیم، درخواست‌ها را با Postman یا Talend API Tester آزمایش کردیم و نکات مهم امنیتی مانند HTTPS، ذخیره امن توکن، محدودسازی درخواست‌ها و کنترل دسترسی را بررسی کردیم.

با این ساختار، می‌توانید توسعه بک‌اند اپلیکیشن موبایل را ادامه دهید و قابلیت‌هایی مانند محصولات، سفارش‌ها، پرداخت و اعلان‌ها را به API اضافه کنید.

منابع رسمی برای مطالعه بیشتر:

  • مستندات Laravel Sanctum: https://laravel.com/docs/sanctum
  • مستندات احراز هویت Laravel: https://laravel.com/docs/authentication
  • مستندات Routing در Laravel: https://laravel.com/docs/routing

نظرات (0)

نظرات پس از تأیید مدیر نمایش داده می‌شوند

هنوز نظری ثبت نشده است؛ اولین نفر باشید!

مقالات مرتبط

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

ساخت CMS با Laravel 12؛ آموزش ساخت سیستم مدیریت محتوا از صفر

۲۴ دقیقه
ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

ساخت فروشگاه اینترنتی با Laravel 12؛ آموزش پروژه‌محور از صفر تا طراحی هسته فروشگاه

۲۲ دقیقه
ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

ساخت Marketplace با Laravel؛ آموزش طراحی فروشگاه چندفروشندگی

۲۲ دقیقه
مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

مدیریت Queueهای سنگین در Laravel؛ آموزش پردازش کارهای طولانی

۲۲ دقیقه