Oracle APEX OTP | رمز یکبار مصرف در اوراکل اپکس

رمز یکبار مصرف در اوراکل اپکس | Oracle APEX One-Time Password (OTP)
در این آموزش با صرف زمان بیشتر، به جای استفاده مستقیم از کد، نحوه ی انجام کار تشریح شده است تا از کپی کردن جلوگیری شود و کاملا بر پیاده سازی خود مشرف باشید.
به منظور پیاده سازی احراز هویت از طریق OTP در Oracle APEX نیازمند انجام مراحل ذیل می باشیم:
جدول نگهداری رمز یکبار مصرف
فیلد های مورد نیاز
- شناسه یکتا (کلید اصلی-identity)
- کد ملی (در صورت نیاز به بررسی)
- شماره تلفن همراه
- رمز یکبار مصرف چهار رقمی (رمز یکبار مصرف)
- زمان تولید رمز یکبار مصرف (TIMESTAMP-مقدار پیش فرض: زمان کنونی)
- تعداد تلاش برای تایید کد(مقدار پیش فرض: 0)
- وضعیت کد چهار رقمی(مقدار پیش فرض: 0)
- زمان آخرین تلاش
- (در صورت نیاز می توانید IP را جهت بررسی و یا سابقه نگهداری نمائید)
پیاده سازی متد ها
متد ارسال پیام کوتاه:
با دریافت خدمات یکی از سرویس دهنده های ارسال پیام کوتاه، وب سرویسی به شما جهت ارسال پیامک از طرف سرویس دهنده ارائه خواهد شد که با فراخوانی آن می توانید پیام مربوطه را ارسال نمائید.
- آموزش نحوه ی فراخوانی وب سرویس از طریق PL/SQL (بزودی)
- آموزش پیاده سازی ماژول ارسال پیام کوتاه (بزودی)
متد تولید رمز یکبار مصرف
پارامتر های ورودی:
- شماره تلفن همراه
- کد ملی
پارامتر های خروجی:
- کد پیگیری
- کد بازخورد (در صورت نیاز)
- شرح بازخورد (در صورت نیاز)
در این متد کافیست مقادیر مورد نیاز را در جدول نگهداری رمز یکبار مصرف درج نمائید.
فیلد رمز یکبار مصرف را بصورت تصادفی مقدار دهی نمائید:
TRUNC(DBMS_RANDOM.VALUE(1000, 9999))
پس از درج اطلاعات، پارامتر خروجی کد پیگیری را با شناسه یکتای جدول مقدار دهی نمائید.
پیام مربوط به رمز یکبار مصرف را از طریق متد ارسال پیام کوتاه، ارسال نمایید.
مقادیر بازخورد را نیز بر حسب موفق یا ناموفق بودن عملیات مقدار دهی نمائید.
متد بررسی رمز یکبار مصرف وارد شده توسط کاربر
پارامتر های ورودی:
- کد پیگیری
- رمز ورود یکبار مصرف
پارامتر های خروجی:
- کد بازخورد
- شرح بازخورد
ابتدا کد پیگیری وارد شده را به همراه شرایط ذیل در جدول نگهداری رمز یکبار مصرف جستجو نمایید:
- وضعیت کد چهار رقمی برابر با صفر باشد
- تعداد تلاش کمتر از مقدار مد نظر (به عنوان مثال کوچکتر از 4)
در صورت بر قرار بودن شرایط فوق، مقادیر بدست آمده از پرس و جو دو فیلد رمز یکبار مصرف و زمان تولید رمز یکبار مصرف.
فاصله ی زمانی از زمان ایجاد رمز یکبار مصرف تا حال را بدست آورید. می توانید برای این منظور از کد ذیل استفاده نمائید:
SELECT EXTRACT(DAY FROM DIFF) * 24 * 60 * 60 * 1000 +
EXTRACT(HOUR FROM DIFF) * 60 * 60 * 1000 +
EXTRACT(MINUTE FROM DIFF) * 60 * 1000 +
ROUND(EXTRACT(SECOND FROM DIFF) * 1000)
FROM (SELECT SYSTIMESTAMP - OTP_TIMESTAMP DIFF FROM DUAL);
حال با در نظر گرفتن شرایط ذیل می توان بازخورد مناسب را ارائه نمود:
- رمز یکبار مصرف صحیح نباشد و از زمان ایجاد رمز، مدت مورد نظر (بطور مثال 2 دقیقه اعتباز زمانی) گذشته باشد:
- “درخواست شما فاقد اعتبار مي باشد.”
- رمز یکبار مصرف صحیح باشد و فاقد اعتبار زمانی باشد:
- “رمز وارد شده منقضي شده است.”
- رمز یکبار مصرف صحیح نباشد:
- بروز رسانی رکورد مربوطه، بدین صورت که مقدار تعداد تلاش برای تایید رمز بعلاوه یک می شود و زمان آخرین تلاش بروز می شود.
- “رمز ورود يکبار مصرف وارد شده صحيح نمي باشد.(“عدد” تلاش ناموفق)”
در صورت گذشتن از شرایط فوق رکورد مربوطه به صورت ذیل بروز شده و بازخورد موفق ارائه می شود:
- تعداد تلاش برای تایید رمز + 1
- زمان آخرین برابر با زمان فعلی
- وضعیت کد چهار رقمی برابر با 1 (استفاده شده)
پیاده سازی فرم Oracle APEX OTP
ابتدا یک Region بدون محتوا ایجاد و ذیل آن یک Item از نوع Hidden با عنوان REF_CODE ایجاد و سپس دو Region یکی مربوط به ورود اطلاعات و دیگری جهت تایید رمز یکبار مصرف مانند تصویر ذیل در صفحه ایجاد نمائید:
پیشنهاد می شود از Templateهای استفاده شده در صفحه ی Login برای صفحه و Region ورود اطلاعات استفاده نمائید.
طراحی Region “دریافت اطلاعات” ساده بوده و نیاز به توضیح ندارد. تنها نکته اعمال تنظیم ذیل می باشد:
Server-side Condition: REF_CODE is NULL
جهت طراحی Region “تایید” طبق دستورالعمل ذیل اقدام نمائید:
- فایل otp.zip را دریافت، از حالت فشرده خارج نموده و otp.css را در Static Application Files بارگذاری نمائید.
- Region Template جدیدی تحت عنوان OTP مانند تصویر ذیل ایجاد نمائید: (کلیک نمائید)
<div role="region" aria-label="#TITLE!ATTR#" class="t-Login-region t-Form--stretchInputs t-Form--labelsAbove #REGION_CSS_CLASSES#" id="#REGION_ID#" #REGION_ATTRIBUTES#> <div class="t-Login-header"> <span class="t-Login-logo #ICON_CSS_CLASSES#"></span> <h1 class="t-Login-title" id="#REGION_STATIC_ID#_heading" data-apex-heading>#TITLE#</h1> </div> <div class="otp-title">کد چهار رقمی ارسال شده از طریق پیامک را وارد نمائید:</div> <div class="t-Login-body"> <div class="opt-ltr">#BODY#</div> <div class="opt-timer" id="timer">2:00</div> </div> <div class="t-Login-buttons">#NEXT#</div> <div class="t-Login-links">#EDIT##CREATE#</div> <div class="t-Login-subRegions">#SUB_REGIONS#</div> </div>
- در صفحه یک Region از نوع Static Content با قالب OPT ایجاد نموده و مقدار ذیل را در تنظیمات آن لحاظ نمائید:
CSS Classes: digit-group Server-side Condition: REF_CODE is NOT NULL
- چهار Item از نوع Number Field ایجاد نموده و مقادیر ذیل را برای آن ها تنظیم نمائید:
Number Alignment: Center Width: 1 Value Required: No Maximum Length: 1 Pre Text: <span class="splitter">-</span>
- برای هر یک از Number Field ها یک Dynamic Action به شکل ذیل ایجاد نمائید: (به جای “?”، شماره ی مربوط به Item را قرار دهید)
- عملکرد مربوط به Dynamic Action هر یک از Number Field ها را مانند تصویر ذیل تنظیم نمائید:
- تنظیم هر یک از عملکرد ها را به صورت ذیل اعمال نمائید: (به جای “قبلی/بعدی”، شماره ی مربوط به Item قبل یا بعد را قرار دهید)
برای Item چهارم (D4) یک Set Focus جهت تمرکز بر روی دکمه ی “تایید”، پس از ورود عدد وجود دارد. تنظیمات آن مانند Set Focus در تصویر فوق (در زمان True) است فقط می بایست Affected Elements را برای دکمه ی “ادامه” تنظیم نمائید. - Dynamic Action دیگری در رویداد Page Load ایجاد و Action آن را “Execute Java Script Code” قرار دهید:
var timeoutHandle; function countdown(minutes) { var seconds = 60; var mins = minutes function tick() { var counter = document.getElementById("timer"); var current_minutes = mins-1 seconds--; counter.innerHTML = current_minutes.toString() + ":" + (seconds < 10 ? "0" : "") + String(seconds); if( seconds > 0 ) { timeoutHandle=setTimeout(tick, 1000); apex.item( "P16_OTP" ).enable(); $('.send_otp').prop('disabled', false); $('.resend_otp').prop('disabled', true); } else { apex.item( "P16_OTP" ).disable() ; $('.send_otp').prop('disabled', true); $('.resend_otp').prop('disabled', false); if(mins > 1){ setTimeout(function () { countdown(mins - 1); }, 1000); } } } tick(); } countdown(2);
- یک Proccess ایجاد و متد تولید رمز یکبار مصرف را در آن فراخوانی نمائید. در صورت دریافت بازخورد موفق، کد پیگیری را در Item مربوطه (REF_CODE) قرار دهید (در صورت باز خورد ناموفق، REF_CODE می بایست NULL باشد). با فشردن دکمه های “ادامه” (Region ورود اطلاعات) و “ارسال مجدد رمز” (Region تایید) این Proccess می بایست اجرا گردد:
Server-side Condition --------------------- Request: is contained in Value Value: BTN_SEND,BTN_RESEND
- Proccess دیگری برای دکمه ی “تایید” در Region “تایید” ایجاد و متد بررسی رمز یکبار مصرف وارد شده توسط کاربر را در آن فراخوانی نمایید. در صورت دریافت بازخورد ناموفق، پیام مربوطه را نمایش داده و در صورت دریافت بازخورد موفق ادامه ی هدفتان را دنبال نمائید.