پیاده سازی SignUp & Login با استفاده از شماره تلفن و اعتبار سنجی کاربر با ارسال OTP Code و استفاده از کاوه نگار(Web service REST)

  • محمد هادی حاجی حسینی
  • 1403/04/13
(قسمت 4 و پایانی) پیاده سازی SignUp & Login با استفاده از شماره تلفن و اعتبار سنجی کاربر با ارسال OTP Code  و استفاده از  کاوه نگار(Web service REST)
OTP Code, CustomAuthenticationBackend, Web service REST

پیاده سازی SignUp & Login با استفاده از شماره تلفن

و

اعتبار سنجی کاربر با ارسال OTP Code  و استفاده از  کاوه نگار(Web service REST)

مقدمه

سلام به تمام دوستان عزیز وب سایت کدینگ یار در این قسمت از سری بلاگ پست های پیاده سازی احرازهویت کاربر با استفاده از OtpCode قصد داریم که بیاییم کاربرمون رو با شماره تلفن ثبت نام کنیم و علاوه بر اون کاربری که قبلا ثبت نام کرده بتونه با شماره تلفنش وارد وبسایتمون بشه.

مثل همیشه خیلی سریع بریم دست به کد بشیم

خب اول بهتره که سناریویی که قراره به عنوان تمرین پیاده اش کنیم رو بهتون توضیح بدم!

ما قراره که بیاییم دوتا ویو لاگین و ساین اپ رو در یک ویو پیاده سازی کنیم،

خب شاید براتون سوال بشه که چراا؟؟

جوابش واضح است خیلی از وب سایت های مطرح حال حاضر ورود و ثبت نامشون رو داخل یک صفحه دارن هندل میکنن، چرا ؟
چون دارن از otp code استفاده میکنن

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

خب اول بهتره نحوه ثبت نام و دریافت Api Key وب سایت کاوه نگار رو بهتون آموزش بدم

پس بریم سر وقتش!

خب اول وارد وب سایت کاوه نگار میشیم

بعد از ثبت نام وارد پنل کاربری خودمون میشیم

وارد حساب من  میشیم

 

 

 

بعد Api Key خودمون رو در جای امن ذخیره میکنیم چون باهاش حالا حالا ها کار داریم.

خب اینو خاطر نشان کنم که شما در حد هزار تومان اعتبار رایگاه برای ارسال پیامک دارین اما یک نکته حائز اهمیت وجود داره اونم اینه از این مبلغ فقط برای ارسال پیامک به خطی که باهاش ثبت نام کردین میتونین استفاده کنین و تا زمانی که به صورت کامل احرازهویت نکنین و سرویسی خریداری نکنین این محدودیت برداشته نمیشه!(این احراز هویت شامل امضا یک تعهد نامه و وارد کردن اطلاعات شخصی و مالی میشه و باید به تایید دفاتر اسناد رسمی برسه)

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

  • قبل این که دست به کد شیم یه نگاهی به داکیومنتیشن خود کاوه نگار بندازین!

خب اینم از ثبت نام سرویس کاوه نگار بریم سراغ استفاده از api سرویس کاوه نگار.

وارد ریپوزیتوری پایتون کاوه نگار بشین

بعد پکیج کاوه نگار رو نصب و نمونه کد قسمت ارسال عادی پیامک رو کپی کنین
چون اینجا قراره از سرویس عادی استفاده کنیم!
اگه بخواین از سرویس ویژه OTP میتونین استفاده کنین منتهی باید خریداریش کنین (:

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

KavenegarApi

بعد اون API_KEY که گفتم ذخیره کنین رو به استفاده از روش های دوره (فایل .envو ...)میاییم در اینجا قرار میدیم.

Sender رو این شماره ای قرار دادم قرار بدین(اگر شماهم قراره فقط تست کنین اگر سرویسی گرفتین همونو بزارین)

Receptor رو شماره تلفنی که قراره از ویو ارسال کنیم قرار بدین

Message هم که پیام دلخواه خودتون به همراه otp code  که قراره بسازیم قرار بدین.

          :()def get_random_otp

return randit(1000 , 999)

داخل همین فایل هم یک فانکشن برای ساخت otp با استفاده از ماژول رندوم میسازیم

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

خب برای تحلیل ویو LoginView نیازه که دوتا کار قبلش انجام بدیم

  • اول بیایین یک url براش بسازین
  • بعد یک فرم برای وارد کردن شماره بسازین

اینارو دیگه توضیحات اضافه نمیدم چون چندین چند باره که داخل پروژه های مختلف پیاده سازیش کردین

لینک گیت هاب پروژه هم اینجا در اختیارتون قرار میدم میتونین بررسی کنین:

https://github.com/lenis03/DjangoCustomLogin

خب بریم سراغ لاگین ویویی که در واقع تلفیقی از دو ویو signup , login هستش:

 

LoginView

خب ما اومدیم داخل این ویو از کلاس view استفاده کردیم تا به راحتی بتونیم ئو منود اصلی رو جداسازی کنیم.

بعد داخل متود گت اومدیم صفحه لاگین رو رندر کردیم و به کاربر نمایش دادیم.

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

بعد از کلین دیتا شماره تلفن رو دریافت و در یک متغییر ذخیره کردیم.

با با یک try/except برسی کردیم که کاربر میخواد لاگین کنه یا ثبت نام اگر ثبت نام میخواست کنه میاییم یک ابجکت یوزر جدید میسازیم بعد یک رندوم otp  براش میسازیم و اونو از طریق api ارسال و بعد به ویو verify که در ادامه تفسریش میکنم ارسالش میکنیم فقط این مورد رو توجه کنین که حتما و حتما باید شماره تلفن رو برای برسی در سشن ذخیره کنین.

اگر داخل بلاک try  رو بخوام تفسیر کنم ما اومدیم بر اساس شماره تلفن برسی کردیم که کاربر از قبل حسابی داره یا نه اگر داره  ابجکت user مربوطه رو دریافت بعد اونو در متغییر user ذخیره و درنهایت یک رندم otp براش میسازیم و اونو داخل فیلد otp مدل user  ذخیره میکنیم (جهت برسی در verify) و در نهایت اونو براش ارسال میکنیم و شماره رو در سشن ذخیره و  به verify  ریدایرکتش میکنیم.

  • دقت کنین که otp حتما باید جهت برسی در مرحله بعد یعنی verify داخل مدل ذخیره بشه

check_otp_expiration

خب بیایین اول داخل helper متودی که در verify بهش احتیاج داریم رو پیاده سازی کنیم.

در این متود ما قراره بیاییم برسی کنین که اونotp کدی که ارسال کردیم منقضی شده یا خیر.

اگر این موردو برسی نکنیم قطعر به مشکل میخوریم چون کاربر با یک بار ارسال otp میتونه هروقت که خواست باهاش لاگین کنه.

اول میاییم داخل بلاک try برسی میکنیم ایا این کاربر که شماره اش رو به عنوان پارامتر دریافت کردیم وجود داره یا نه اگر وجود نداشته باشه ارور DoesNotExcist ریز میشه

اگر وجود داشت با ماژول datetime زمان فعلی رو به دست میاریم بعد از otp_time کم میکنیم تا اختلافش به دست بیاد اگر اختلاف بیشتر از ثانیه مد نظر ما بود False رو برمیگردونیم در غیر این  صورت True.

 بریم سراغ متود verify در این متود ما سعی میکنیم برسی کنیم که اینotp که کاربر ارسال کرده صحت داره یا خیر و علاوه بر اون منقضی شده یا هنوز معتبره!

verify

خب در این ویو ما اولین کاری که در بلاک try انجام میدیم اینه که از سشن کاربر میاییم مقدار phone_number رو دریافت میکنیم.

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

بعد اگر متود پست بود میاییم برسی میکنیم (با همون فانکشنی که در helper ساختیم) که آیا این otp هنوز معتبره یا نه بعد با otp که در دیتابیس ذخیره کردیم مقایسه میکنیم اگر همون بود کاربر رو لاگین میکنیم در غیر این صورت ارور raise میکنیم. و مجددا به همین صفحه redirect اش میکنیم.

ئر نهایت اگر همه چی اوکی بود  کاربر رو به صفحه home هدایت میکنیم.

سخن پایانی

در این جا ما نحوه پیاده سازی احراز هویت کاربر با opt رو مورد بررسی قرار دادیم روش های بساری برای این احراز هویت وجود داره مانند:

  • Session Variable(More Secure)
  • Cache(easier and faster)
  • Database
  • Client Side Storage(not recommended at all)

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

برای مثال شما میتونین:

  • این دو ویو رو از هم تفکیک کنین
  • ارسال پیامک رو async کنین(Celery & Rabbitmq)
  • پاک کردن سشن بعد از لاگین کاربر
  • برسی otp کد تا در صورت وجود otp مجددا otp ساخته و ارسال نشه تا هزینه های گذاف روی دستمون بزاره و بعضیا بتونن از این مورد سواستفاده کنن و...

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

امیدوارم تا اینجای کار از آموزش ها لذت برده باشین، همچنین نظرتون رو حتما با ما یعنی تیم کدینگ یار به اشتراک بگذارین که همین حمایت های شما باعث قوت قلب و انرژی ما برای ساخت چنین آموزش هایی میشه.

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

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