== UC001 - Најава во системот '''Иницијален актер:''' Посетител '''Други актери:''' - Посетителот сака да се автентицира со е-пошта и лозинка и да добие пристап до функционалностите наменети за неговата улога. Целта е издаден пристапен токен со кој сите останати случаи на употреба знаат кој е корисникот и што смее да прави. === Сценарио 1. Посетителот ја отвора почетната страница и ги внесува е-поштата и лозинката. 2. Системот го бара корисникот по е-пошта. Колоната email има ограничување UNIQUE, па барањето враќа најмногу еден ред. {{{#!sql SELECT id, email, password, role FROM project.users WHERE email = 'stefan.saveski@students.finki.ukim.mk'; }}} 3. Ако не е пронајден корисник, системот прикажува иста порака како и при погрешна лозинка, за да не се открие кои е-пошти постојат во системот. 4. Системот ја споредува внесената лозинка со зачуваниот BCrypt hash. Споредбата се врши во апликацијата, бидејќи во базата се чува само hash-от. 5. Ако лозинката е точна, системот издава пристапен токен (JWT) кој ги содржи идентификаторот, е-поштата и улогата на корисникот. 6. Ако корисникот побарал да остане најавен, системот запишува и токен за освежување. {{{#!sql INSERT INTO project.token (user_id, token, expires_at, is_valid) VALUES (1, 'BCfXBUR-Q2E7Vkglwh5OmdbhHH0MS-askSO8M0W6sRk', now() + interval '1 month', TRUE); }}} 7. Системот го пренасочува корисникот според улогата: студентите кон студентскиот дел, професорите кон професорскиот. 8. При подоцнежно освежување на сесијата, системот го проверува токенот за освежување. {{{#!sql SELECT t.id, t.user_id, u.email, u.role FROM project.token t JOIN project.users u ON u.id = t.user_id WHERE t.token = 'BCfXBUR-Q2E7Vkglwh5OmdbhHH0MS-askSO8M0W6sRk' AND t.is_valid = TRUE AND t.expires_at > now(); }}} 9. При одјава, системот го поништува токенот без да го брише, за да остане трага. {{{#!sql UPDATE project.token SET is_valid = FALSE WHERE user_id = 1 AND is_valid = TRUE; }}} === Алтернативни текови * '''3а.''' Непостоечка е-пошта или погрешна лозинка - системот прикажува општа порака за неуспешна најава. * '''8а.''' Токенот е истечен или поништен - барањето не враќа ниту еден ред и корисникот мора повторно да се најави. === Забелешки * Улогата се чува како набројувачки тип user_role со вредности 'student', 'prof' и 'admin', па во базата не може да се внесе непостоечка улога.