SL
SkillsLao Learner Portal
Prototype
๐ŸŽฌ Simulate:

Sign in


or

Don't have an account? Sign up

Uses sub-flows:

๐Ÿ”€ SUC-IDP-03 โ€” Authenticate via Google SSO ๐Ÿ”€ SUC-IDP-05 โ€” Authenticate via OS Quick Login (mobile app only โ€” not applicable here)
๐Ÿ“ Spec notes โ€” UC-IDP.02 / SCR-IDP.22 (fields, actions, requirements)
Identity
  • Screen: SCR-IDP.22 โ€” Login (Password + Google SSO)
  • Use case: UC-IDP.02 โ€” Login โ€” Learner
Brief description

Main login screen for learners โ€” supports Password and Google SSO. Two inline error states: E1 โ€” invalid credential (error_message visible when login_failed && !lockout_active); E2 โ€” locked after 5 failed attempts (lockout_countdown visible, submit disabled). On success โ†’ SCR-LMS.01 (Browse Course Catalog). "Forgot Password?" โ†’ UC-IDP.22.
Learner Portal (web) note: AF-1A / AF-1A.1A (OS quick login, SUC-IDP-05) is a mobile-app-only capability per the requirements model's Sub-Use-Case invocation table โ€” not rendered on this web prototype. See the Learner Mobile prototype for that scenario.

Fields
  • login_identifier "Email / Mobile Number" โ€” text ยท AuthIdentity.provider_uid ยท required ยท validation: one_of[email, phone], max_length:255 ยท always visible
  • password "Password" โ€” password ยท null (backend checks against AuthIdentity.credential hash) ยท required ยท validation: min_length:8 ยท always visible
  • error_message "Error message" โ€” text read-only ยท default "Invalid email or password" ยท visible when login_failed == true && lockout_active == false โ€” prototype: scenario=AF-3A / AF-3B (same message renders for both, by design โ€” prevents account enumeration)
  • lockout_countdown "Lockout countdown" โ€” computed from PasswordAttempt.lock_until ยท visible when lockout_active == true โ€” prototype: scenario=AF-3C
Actions
  • submit "Sign in" โ€” enabled when required_fields_valid && lockout_active == false ยท triggers UC-IDP.02-M-2 ยท disabled in lockout / account-suspended states (AF-3C, AF-3D)
  • google_sso "Sign in with Google" โ€” enabled always ยท triggers UC-IDP.02-A-2A-1 โ†’ SUC-IDP-03
  • forgot_password "Forgot Password?" โ€” enabled always ยท triggers UC-IDP.02-A-3B-2 โ†’ UC-IDP.22
  • sign_up "Sign up" โ€” enabled always ยท triggers UC-IDP.01-M-1
Additional requirements
  1. Error message must always read "Invalid email or password" regardless of whether identifier or password is wrong โ€” prevents account enumeration. This also covers AF-3A (account not found) โ€” same generic message is shown, not a distinct "no account found" message. [refs: none]
  2. During lockout (lockout_active == true): submit button disabled + real-time 15-minute countdown. [refs: SS-IDP.13]
  3. Keyboard focus order: login_identifier โ†’ password โ†’ submit. Tab/Shift+Tab on both web and mobile browsers. [refs: NFR-09]
โš  Source note

SCR-IDP.09 (Account Not Found) and SCR-IDP.10 (Account Suspended) are marked status: deprecated and used_in_ucs: [] in screens.yaml โ€” "designed as a shared dialog but never wired into any UC; each login/forgot-password UC inlines its own message instead." AF-3A and AF-3D are therefore rendered as inline alerts on this screen rather than as separate dialog modals.