احراز هویت کاربران با رمز یکبار مصرف (OTP) در لاراول

وقت طلاست!
وقت طلاست!

امروزه اکثر برنامه‌های کاربردی تحت وب ترجیح می‌دهند به جای استفاده از نام کاربری/رمز عبور که یک سیستم احراز هویت کلاسیک برای اعتبارسنجی کاربران بود، از OTP استفاده کنند. زیرا، این راه امن تر است و برخلاف رمزهای عبور استاتیک، در برابر حملات مجدد آسیب پذیر نیستند.

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

دغدغه هایی از قبیل:

  • چگونه می توانم یک توکن امن تولید کنم؟
  • توکن تولید شده را کجا باید ذخیره کنم؟
  • آیا توکن معتبر است یا خیر؟
  • آیا توکن منقضی شده است یا خیر؟
  • چگونه می توانم یک سیستم یکپارچه و همچنین قابل استفاده برای سطوح کاربران مختلف داشته باشم؟
  • و غیره...

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

https://github.com/mohammad-fouladgar/laravel-otp

روش های استفاده

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


 # Send OTP via SMS.
OTP()->send('09130000000');
# OR
OTP('09130000000');

 # Send OTP via channels.
OTP()->channel(['otp_sms', 'mail', \CustomSMSChannel::class])->send('09130000000');
# OR
OTP('09130000000', ['otp_sms', 'mail', \CustomSMSChannel::class]);

# Send OTP for specific user provider
OTP()->useProvider('admins')->send('09130000000');

# Validate OTP
OTP()->validate('09130000000', 'token_123');
# OR
OTP('09130000000', 'token_123');
# OR
OTP()->useProvider('users')->validate('09130000000', 'token_123');

شروع

ابتدا باید پکیج لاراول OTP را از طریق composer نصب کنید:

composer require fouladgar/laravel-otp

سپس، فایل config/otp.php را با اجرای دستور زیر منتشر کنید:

php artisan vendor:publish --provider=&quotFouladgar\OTP\ServiceProvider&quot --tag=&quotconfig&quot

آماده سازی مدل

در مرحله بعد، مطمئن شوید که مدل مورد نظر اینترفیس Fouladgar\OTP\Contracts\OTPNotifiable را پیاده سازی کرده و همچنین از تریت Fouladgar\OTP\Concerns\HasOTPNotify استفاده می کند:

https://gist.github.com/mohammad-fouladgar/802830fcde11e557b91ce0cf8eb8b78f#file-user-php

یک OTPSMSCchannel پیش‌فرض وجود دارد که برای ارسال توکن تولید شده به کاربر، به یک SMSClient نیاز دارد.

پس باید ابتدا SMSClient خود را مشخص کرده و اینترفیس Fouladgar\OTP\Contracts\SMSClient را پیاده سازی کنید. این اینترفیس شما را ملزم به پیاده سازی متد sendMessage می کند.

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

https://gist.github.com/mohammad-fouladgar/43539893a02ab26eda59501e08f3af42#file-samplesmsclient-php

در مرحله بعد، باید کلاس SampleSMSClient را در فایل config/otp.php ست کنید:

https://gist.github.com/mohammad-fouladgar/aec20546fa81e33707ffc9a7908de415#file-sms_client_config-php

راه اندازی Routes و Controller

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

می‌توانید آن‌ها را در فایل web یا api اضافه کنید. بستگی به این دارد که بخواهید از OTP به عنوان Full Stack یا API Back-End استفاده کنید. این به شما بستگی دارد. در این مقاله ترجیح می دهم از راه دوم استفاده کنم.

فایل routes/api.php را باز کنید و این route ها را قرار دهید:

https://gist.github.com/mohammad-fouladgar/ef375de0cbacad659e542b50c31f0f80#file-otp_routes-php

و سپس یک کنترلر AuthController.php مانند کلاس زیر ایجاد کنید:

https://gist.github.com/mohammad-fouladgar/a02af640d155acacea1f66b7d9ac62e1#file-otpauthcontroller-php

متد validate کاربر احراز شده را برمیگرداند و شما میتوانید بر اساس سیستم خود عملیات login را پیاده سازی کنید.

با فرض استفاده از Sanctum شما کدی شبیه زیر را خواهید داشت:

$token = $user->createToken('your_device_name')->plainTextToken;

return response()->json([
    'message' => 'Login has been successfully.',
    'token'   => $token,
    'result'  => UserResource::make($user),
])

حالا می توانید route های زیر را call کنید:

# send otp request
curl --request POST \
  --url http://localhost/api/send-otp \
  --data '{
 &quotmobile&quot : &quot09130000000&quot
}'

# validate otp request
curl --request POST \
  --url http://localhost/api/validate-otp \
  --data '{
 &quotmobile&quot : &quot09130000000&quot,
 &quottoken&quot : &quot94352&quot
}'

ممنون از وقت با ارزشی که گذاشتید و این مقاله رو مطالعه کردید.

امیدوارم که بتونید از این پکیج در پروژه های خود استفاده کنید.

برای خوندن داکیومنت این پکیج به آدرس گیت هاب زیر مراجعه کنید:

https://github.com/mohammad-fouladgar/laravel-otp