| 6 | | === Чекори |
| 7 | | 1. Корисникот кликнува на копчето „Најави се“ (Log In) |
| 8 | | 2. На корисникот му се прикажува форма со две полиња - е-пошта и лозинка |
| 9 | | 3. Корисникот ја пополнува формата со податоците внесени при регистрација |
| 10 | | 4. Корисникот кликнува на копчето „Најави се“ |
| 11 | | 5. Системот ја пребарува базата за корисник со внесената е-пошта |
| 12 | | 6. Внесената лозинка се споредува со хешираната лозинка во базата (BCrypt) |
| 13 | | 7. Доколку податоците се точни, системот генерира JWT и refresh токен |
| 14 | | 8. По успешна најава корисникот се пренасочува кон почетната страна според неговата улога |
| | 5 | '''Други актери:''' - |
| | 6 | |
| | 7 | Посетителот сака да се автентицира со е-пошта и лозинка и да добие пристап до |
| | 8 | функционалностите наменети за неговата улога. Целта е издаден пристапен токен со |
| | 9 | кој сите останати случаи на употреба знаат кој е корисникот и што смее да прави. |
| | 10 | |
| | 11 | === Сценарио |
| | 12 | |
| | 13 | 1. Посетителот ја отвора почетната страница и ги внесува е-поштата и лозинката. |
| | 14 | |
| | 15 | 2. Системот го бара корисникот по е-пошта. Колоната email има ограничување UNIQUE, па барањето враќа најмногу еден ред. |
| | 16 | {{{#!sql |
| | 17 | SELECT id, email, password, role |
| | 18 | FROM project.users |
| | 19 | WHERE email = 'stefan.saveski@students.finki.ukim.mk'; |
| | 20 | }}} |
| | 21 | |
| | 22 | 3. Ако не е пронајден корисник, системот прикажува иста порака како и при погрешна лозинка, за да не се открие кои е-пошти постојат во системот. |
| | 23 | |
| | 24 | 4. Системот ја споредува внесената лозинка со зачуваниот BCrypt hash. Споредбата се врши во апликацијата, бидејќи во базата се чува само hash-от. |
| | 25 | |
| | 26 | 5. Ако лозинката е точна, системот издава пристапен токен (JWT) кој ги содржи идентификаторот, е-поштата и улогата на корисникот. |
| | 27 | |
| | 28 | 6. Ако корисникот побарал да остане најавен, системот запишува и токен за освежување. |
| | 29 | {{{#!sql |
| | 30 | INSERT INTO project.token (user_id, token, expires_at, is_valid) |
| | 31 | VALUES (1, 'BCfXBUR-Q2E7Vkglwh5OmdbhHH0MS-askSO8M0W6sRk', now() + interval '1 month', TRUE); |
| | 32 | }}} |
| | 33 | |
| | 34 | 7. Системот го пренасочува корисникот според улогата: студентите кон студентскиот дел, професорите кон професорскиот. |
| | 35 | |
| | 36 | 8. При подоцнежно освежување на сесијата, системот го проверува токенот за освежување. |
| | 37 | {{{#!sql |
| | 38 | SELECT t.id, t.user_id, u.email, u.role |
| | 39 | FROM project.token t |
| | 40 | JOIN project.users u ON u.id = t.user_id |
| | 41 | WHERE t.token = 'BCfXBUR-Q2E7Vkglwh5OmdbhHH0MS-askSO8M0W6sRk' |
| | 42 | AND t.is_valid = TRUE |
| | 43 | AND t.expires_at > now(); |
| | 44 | }}} |
| | 45 | |
| | 46 | 9. При одјава, системот го поништува токенот без да го брише, за да остане трага. |
| | 47 | {{{#!sql |
| | 48 | UPDATE project.token |
| | 49 | SET is_valid = FALSE |
| | 50 | WHERE user_id = 1 AND is_valid = TRUE; |
| | 51 | }}} |
| | 52 | |
| | 53 | === Алтернативни текови |
| | 54 | |
| | 55 | * '''3а.''' Непостоечка е-пошта или погрешна лозинка - системот прикажува општа порака за неуспешна најава. |
| | 56 | * '''8а.''' Токенот е истечен или поништен - барањето не враќа ниту еден ред и корисникот мора повторно да се најави. |
| | 57 | |
| | 58 | === Забелешки |
| | 59 | |
| | 60 | * Улогата се чува како набројувачки тип user_role со вредности 'student', 'prof' и 'admin', па во базата не може да се внесе непостоечка улога. |