پیاده سازی SignUp & Login با استفاده از شماره تلفن
و
اعتبار سنجی کاربر با ارسال OTP Code و استفاده از کاوه نگار(Web service REST)
سلام به تمام دوستان عزیز وب سایت کدینگ یار در این قسمت از سری بلاگ پست های پیاده سازی احرازهویت کاربر با استفاده از OtpCode قصد داریم که بیاییم کاربرمون رو با شماره تلفن ثبت نام کنیم و علاوه بر اون کاربری که قبلا ثبت نام کرده بتونه با شماره تلفنش وارد وبسایتمون بشه.
مثل همیشه خیلی سریع بریم دست به کد بشیم
خب اول بهتره که سناریویی که قراره به عنوان تمرین پیاده اش کنیم رو بهتون توضیح بدم!
ما قراره که بیاییم دوتا ویو لاگین و ساین اپ رو در یک ویو پیاده سازی کنیم،
خب شاید براتون سوال بشه که چراا؟؟
جوابش واضح است خیلی از وب سایت های مطرح حال حاضر ورود و ثبت نامشون رو داخل یک صفحه دارن هندل میکنن، چرا ؟
چون دارن از otp code استفاده میکنن
مورد دوم اینه که این یک پست بلاگ اموزشیه و هدف از این بلاگ پست اینه که مسیر و منطق پیاده سازی رو به صورت خیلی خیلی ساده نشونتون بدیم تا خودتون بتونین این فیچر رو پیاده سازی کنین و بعد اگه خواستین بر حسب نیاز قابلیت های دلخواه خودتون رو بهش اضافه کنین.
خب اول بهتره نحوه ثبت نام و دریافت Api Key وب سایت کاوه نگار رو بهتون آموزش بدم
پس بریم سر وقتش!
خب اول وارد وب سایت کاوه نگار میشیم

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

بعد Api Key خودمون رو در جای امن ذخیره میکنیم چون باهاش حالا حالا ها کار داریم.
خب اینو خاطر نشان کنم که شما در حد هزار تومان اعتبار رایگاه برای ارسال پیامک دارین اما یک نکته حائز اهمیت وجود داره اونم اینه از این مبلغ فقط برای ارسال پیامک به خطی که باهاش ثبت نام کردین میتونین استفاده کنین و تا زمانی که به صورت کامل احرازهویت نکنین و سرویسی خریداری نکنین این محدودیت برداشته نمیشه!(این احراز هویت شامل امضا یک تعهد نامه و وارد کردن اطلاعات شخصی و مالی میشه و باید به تایید دفاتر اسناد رسمی برسه)
بهتره تا یادم نرفته اینو بگم که اگه سرویسی خریداری نکردین و فقط میخواین در حد تست استفاده کنین باید پیامک های تبلیغاتی خطتتون باز باشه چون شماره سرویسی که ازش میخوایم استفاده کنیم و فقط حق استفاده از همین رو تا قبل احرازهویت داریم سرشماره تبلیغاتی محسوب میشه و این سرشماره ها معمولا بلاک میشن
برای فعال کردن پیامک های تبلیغاتی بسته به نوع شرکت سیمکارتتون مینونین از کد دستوری یا اپلیکیشن همون شرکت استفاده کنین و حدودا فعالسازیش 24 ساعت زمان میبره.
خب اینم از ثبت نام سرویس کاوه نگار بریم سراغ استفاده از api سرویس کاوه نگار.
وارد ریپوزیتوری پایتون کاوه نگار بشین
بعد پکیج کاوه نگار رو نصب و نمونه کد قسمت ارسال عادی پیامک رو کپی کنین
چون اینجا قراره از سرویس عادی استفاده کنیم!
اگه بخواین از سرویس ویژه OTP میتونین استفاده کنین منتهی باید خریداریش کنین (:
بعد داخل اپ accounts یک فایل پایتونی به اسم helper میسازیم و این قطه کد رو در اینجا قرار میدیم.

بعد اون API_KEY که گفتم ذخیره کنین رو به استفاده از روش های دوره (فایل .envو ...)میاییم در اینجا قرار میدیم.
Sender رو این شماره ای قرار دادم قرار بدین(اگر شماهم قراره فقط تست کنین اگر سرویسی گرفتین همونو بزارین)
Receptor رو شماره تلفنی که قراره از ویو ارسال کنیم قرار بدین
Message هم که پیام دلخواه خودتون به همراه otp code که قراره بسازیم قرار بدین.
:()def get_random_otp
return randit(1000 , 999)
داخل همین فایل هم یک فانکشن برای ساخت otp با استفاده از ماژول رندوم میسازیم
نحوه پیاده سازیشم که کاملا مشخصه بار ها از این ماژول استفاده کردیم!
خب برای تحلیل ویو LoginView نیازه که دوتا کار قبلش انجام بدیم
اینارو دیگه توضیحات اضافه نمیدم چون چندین چند باره که داخل پروژه های مختلف پیاده سازیش کردین
لینک گیت هاب پروژه هم اینجا در اختیارتون قرار میدم میتونین بررسی کنین:
https://github.com/lenis03/DjangoCustomLogin
خب بریم سراغ لاگین ویویی که در واقع تلفیقی از دو ویو signup , login هستش:

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

خب بیایین اول داخل helper متودی که در verify بهش احتیاج داریم رو پیاده سازی کنیم.
در این متود ما قراره بیاییم برسی کنین که اونotp کدی که ارسال کردیم منقضی شده یا خیر.
اگر این موردو برسی نکنیم قطعر به مشکل میخوریم چون کاربر با یک بار ارسال otp میتونه هروقت که خواست باهاش لاگین کنه.
اول میاییم داخل بلاک try برسی میکنیم ایا این کاربر که شماره اش رو به عنوان پارامتر دریافت کردیم وجود داره یا نه اگر وجود نداشته باشه ارور DoesNotExcist ریز میشه
اگر وجود داشت با ماژول datetime زمان فعلی رو به دست میاریم بعد از otp_time کم میکنیم تا اختلافش به دست بیاد اگر اختلاف بیشتر از ثانیه مد نظر ما بود False رو برمیگردونیم در غیر این صورت True.
بریم سراغ متود verify در این متود ما سعی میکنیم برسی کنیم که اینotp که کاربر ارسال کرده صحت داره یا خیر و علاوه بر اون منقضی شده یا هنوز معتبره!

خب در این ویو ما اولین کاری که در بلاک try انجام میدیم اینه که از سشن کاربر میاییم مقدار phone_number رو دریافت میکنیم.
بعد کاربر رو بر اساس شماره تلفن از دیتابیس واکشی میکنیم.
بعد اگر متود پست بود میاییم برسی میکنیم (با همون فانکشنی که در helper ساختیم) که آیا این otp هنوز معتبره یا نه بعد با otp که در دیتابیس ذخیره کردیم مقایسه میکنیم اگر همون بود کاربر رو لاگین میکنیم در غیر این صورت ارور raise میکنیم. و مجددا به همین صفحه redirect اش میکنیم.
ئر نهایت اگر همه چی اوکی بود کاربر رو به صفحه home هدایت میکنیم.
در این جا ما نحوه پیاده سازی احراز هویت کاربر با opt رو مورد بررسی قرار دادیم روش های بساری برای این احراز هویت وجود داره مانند:
ما در این آموزش از ذخیره توکن در دیتابیس استفاده کردیم و سعی کردیم به ساده ترین روش تمام موارد رو پوشش بدیم تا منطق پیاده سازی این فیچر کاملا براتون جا بیافته و خودتون در صورت تمایل این مورد رو توسعه بدین.
برای مثال شما میتونین:
که این موارد رو با توجه به این که کاملا خودتون از پس پیاده سازیش برمیایین به خودتون میسپارم.
امیدوارم تا اینجای کار از آموزش ها لذت برده باشین، همچنین نظرتون رو حتما با ما یعنی تیم کدینگ یار به اشتراک بگذارین که همین حمایت های شما باعث قوت قلب و انرژی ما برای ساخت چنین آموزش هایی میشه.
اگر فکر می کنید که ما چیزی را در این مقاله جا انداخته ایم و یا در مورد پست های بعدی ایده و یا نظری دارید، خوشحال می شویم که این مورد را با ما در میان بگذارید. تنها کافیست روی دکمه زیر کلیک کنید و پیشنهاد خود را ارسال کنید.