پروژه SSO
سناریو کلی :
- پس از redirect شدن کاربر به سمت سامانه بر روی آدرس oauth/authorize/ کاربر را به / ریدارکت میکنیم و کنترلری برای اینکار نوشته شده که index.html حاوی انگولار را بر میگرداند.
- بعد از لود شدن صفحه انگولار درخواستی تحت عنوان initiate-login داده میشود که در آن اطلاعات موردنیاز برای صفحه لاگین و آدرس صفحه بعدی داده میشود
- پس از واردنمودن کدملی دکمه ادامه زده میشود که در آن آدرس صفحه بعدی از پاسخ سرویس قبلی فراخوانی میشود که در مرحله اول send/otp/ است
- پس از وارد کردن کد پیامکی توسط کاربر سرویس authenticate/first-page/ فراخوانی میشود و در صورت موفقیت آمیز بودن کلاینت درخواست آخر برای احرازهویت یعنی /login را میزند.
- در پاسخ این درخواست کاربر هدایت میشود به آدرس oauth/authorize/ که اول درخواست آن را داده بود و پس از آن به نهادمتکی که از آنجا اومده بود هدایت میشود.
جزئیات مراحل :
سرویس initiate login
آدرس سرویس : initiate-login/
بدنه درخواست : ندارد
متد : POST
پاسخ :
{ "success": { "next_page": "login", "next_page_action": "/send/otp", "next_page_data": { "login": { "user_info": { "mobile_number": "", "national_number": "", "loa": "" }, "client_info": { "scope_titles": "", "client_name": "", "client_id": "", "download_address": "" }, "general_info": { "captcha_address": "", "deprecate_address": "", "download_address": "" } } }, "ready_for_final_authenticate": false } }
توضیح پاسخ :
با فراخوانی این سرویس مشخص میشود که اصلا کاربر میتواند صفحه لاگین را ببیند یا اگر پاسخ خطا داشت صفحه خطا را ببیند یا صفحه لاگین را با حالت خطا ببیند.
- در قسمت next_page_data اطلاعات صفحه جاری قرار دارد و خود این قسمت دارای زیربخش باتوجه به هر قسمتی است در واقع چون الان در صفحه لاگین هستیم اطلاعات موردنیاز آن در زیرقسمت login است ولی برای نمونه اگر برای بخش otp بود میشد زیربخش otp و به طبع اطلاعات خاص خود را میداشت
- در قسمت user_info اطلاعات کاربر قرار دارد
- در قسمت client_info اطلاعات نهاد متکی قراردارد و دیگر نیازی به فراخوانی سرویس download برای logo نیستیم و در همین پاسخ برگردانده میشود
- در قسمت general_info اطلاعات موردنیاز برای صفحه اول است.
- فیلد next_page نشان دهنده صفحه موردنظر است که چون در ابتدا کاربر در صفحهای نیست به صفحه لاگین میرود
- فیلد next_page_action نشان دهندهی آدرسی است که با زدن دکمه ادامه فراخوانی میشود
نمونه پاسخ غلط (وقتی کاربر نیاز دارد فرآیند را از اول شروع کند)
{ "error": { "next_page": "error", "reason": "user should start process from the begining", "next_page_action":"", "next_page_data":{} } }
توضیح این پاسخ در پاسخ سرویس پیامکی به صورت کامل آمده است.
سرویس ارسال پیامک
آدرس سرویس : send/otp/
بدنه درخواست : اطلاعات کدملی و شماره موبایل
متد : POST
نوع محتوا : application/x-www-form-urlencoded
پاسخ :
{ "error": { "next_page": "it can be any page or error page", "reason": "error reason", "next_page_action":"/authenticate/first-page", "next_page_data":{} }, "success": { "next_page": "otp", "next_page_action":"/authenticate/first-page" "next_page_data": { "otp": { "code_expire_date":12312 } }, "ready_for_final_authenticate": false } }
توضیح پاسخ :
- در قسمت error در صورتی که خطایی رخ داده باشد این فیلد در پاسخ قرار میگیرد و در صورت موفقیت آمیز بودن درخواست اثری از آن نیست
- فیلد next_page : وقتی برابر صفحه error باشد حالتی است که در آن باید کاربر را به صفحه error برد و در آنجا مقدار فیلد reason را در آن صفحه نشان داد.
- فیلد next_page : وقتی برابر صفحه ای مثل login, otp و یا push otp باشد باید مقدار خطا را در آن صفحه به صورت toast نشان دهد (اگر مقدار فیلد next_page با صفحه جاری برابر بود به طبع دیگر نیازی به تغییر صفحه نیست و همانجا باید پیام خطا toast شود)
فیلد reason : نشان دهنده دلیل خطاست. - فیلد next_page_action : آدرسی که دکمه موجود در آن صفحه حاوی خطا، دربر دارد تا کاربر آن را فراخوانی کند.
- فیلد next_page_data : اطلاعاتی که در آن صفحه حاوی خطا، نیاز است تا در صفحه نمایش داده بشود.
- در قسمت success در صورتی که عملیات با موفقیت انجام شود این فیلد در پاسخ قرار میگیرد.
- فیلد next_page : صفحه بعدی را نشان میدهد .
- فیلد next_page_action : آدرسی که دکمه موجود در صفحه otp برای واردنمودن کد دریافت شده توسط کاربر را نشان میدهد
- فیلد next_page_data : اطلاعاتی که در صفحه آتی (اینجا otp) است را شامل میشود
- فیلد ready_for_final_authenticate : اگر برابر true بود در پاسخ هر سرویسی به منظور آن است که کاربر تمام مراحل احرازهویت موردنظر را به پایان رسانده است و باید درخواست login/ فراخوانی شود. که در جواب این درخواست کاربر redirect میشود.
دکمه ارسال مجدد پیامک در صفحه otp نیز همین سرویس را فراخوانی میکند.
سرویس احرازهویت اطلاعات صفحه اول (first-page)
آدرس سرویس : authenticate/first-page/
بدنه درخواست : کد واردشده
متد : POST
نوع محتوا : application/x-www-form-urlencoded
پاسخ :
{ "success": { "next_page": "otp", "next_page_action":"/login" "next_page_data":{}, "ready_for_final_authenticate": true } }
توضیح پاسخ :
در هر پاسخی وقتی مقدار ready_for_final_authenticate برابر true بود باید login/ فراخوانی شود و کاربر redirect شود.
پاسخ خطا (در صورتی که شاهکار اطلاعات کاربر را قبول نکند)
{ "error": { "next_page": "login", "reason": "mobile number and national number not matched", "next_page_action":"/authenticate/first-page", "next_page_data":{ "login": { "user_info": { "mobile_number": "", "national_number": "", "loa": "" }, "client_info": { "scope_titles": "", "client_name": "", "client_id": "", "download_address": "" }, "general_info": { "captcha_address": "", "deprecate_address": "", "download_address": "" } } } } }
در این حالت کاربر صفحه لاگین را میبیند و در آنجا پیام خطا toast میشود و اطلاعات موردنیاز هر صفحه در قسمت next_page_data قرار میگیرد.
پاسخ خطا (در صورتی که کد پیامکی اشتباه زده باشد)
{ "error": { "next_page": "otp", "reason": "otp was incorrect", "next_page_action":"/authenticate/first-page", "next_page_data":{ "code_expire_date":1111 } } }
در این حالت کاربر در صفحه otp میماند و پیام خطا نشان داده میشود.
پاسخ درست (حالتی که مرحله بعد صفحه تشخیص چهره باشد)
{ "success": { "next_page": "facedetection", "next_page_action":"/authenticate/face-decetion" "next_page_data":{...}, "ready_for_final_authenticate": false } }
در این حالت کاربر به صفحه تشخیص چهره هدایت میشود