Створення системи відвідувань на основі розпізнавання обличчя з використанням React та FACEIO

pic

Чи то керування командою дистанційно, чи то навчання групи студентів, наявність системи відвідувань може значно спростити процес відстеження того, хто активний, а хто ні. Ефективна система відвідувань не тільки покращує ведення обліку, але й мотивує учасників команди чи студентів регулярно реєструвати своє відвідування.

Щоб зробити процес ще більш безпечним, ви можете вийти за межі традиційних методів аутентифікації, таких як паролі чи QR-коди. Додавши Біометричну Аутентифікацію за допомогою Обличчя (Facial Authentication), ви забезпечите швидке та безфродове відстеження відвідувань.

У цій статті ми побудуємо Систему Відвідувань за допомогою React та FACEIO для аутентифікації за обличчям.

Це веб-додаток для системи відвідувань, яку ми будемо будувати.

pic

Звучить цікаво? Почнемо!

Попередні вимоги

Перед тим як почати, переконайтесь, що у вас є наступне:

  • Базове розуміння JavaScript та React.js.
  • Обліковий запис на FACEIO.
  • Node.js та npm для керування залежностями.
  • Встановлений FACEIO NPM пакет.
  • Текстовий редактор або IDE, наприклад, VS Code.

Що таке FACEIO?

FACEIO — це фреймворк для біометричної аутентифікації за допомогою обличчя, який можна інтегрувати на будь-якому вебсайті за допомогою JavaScript для аутентифікації користувачів за допомогою розпізнавання обличчя замість використання пароля чи OTP коду.

Побудова системи відвідувань

У цьому розділі ми пройдемо через процес налаштування React проєкту та інтеграції бібліотеки FaceIO для відстеження відвідувань на основі біометричної аутентифікації.

Налаштування React проєкту
Щоб почати, відкрийте термінал і створіть новий React додаток за допомогою наступної команди:

npx create-react-app attendance-system

Це створить новий React проєкт у директорії з назвою attendance-system. Перейдіть у цю директорію, щоб почати налаштовувати проєкт.

cd attendance-system

Далі встановіть SDK для FACEIO:

npm install faceio

Це встановить бібліотеку FaceIO та її залежності, що дозволить вам використовувати функції розпізнавання обличчя у вашій системі відвідувань.

Щоб використовувати SDK FaceIO, необхідно встановити його окремо. Це можна зробити за допомогою наступної команди:

npm install @faceio/fiojs

Ви також можете встановити SDK FaceIO за допомогою цієї команди:

npm install @faceio/fiojs@latest

Для UI веб-додатку ми використовуємо Shadcn UI, тому для встановлення необхідних залежностей виконайте наступну команду:

npm install react shadcn react-dom react-router-dom react-hook-form @hookform/resolvers yup

Тепер ми можемо створити функції реєстрації та входу для нашої системи, але перед цим ініціалізуємо FaceIO на нашій сторінці за допомогою хука useEffect.

useEffect(() => {  
 const initializeFaceIO = () => {  
 try {  
 const faceioInstance = new faceIO("My Public_ID");  
 setFaceio(faceioInstance);  
 } catch (err: any) {  
 setError("Не вдалося ініціалізувати FaceIO: " + err.message);  
 }  
 };  
 initializeFaceIO();  
 }, []);

Компонент аутентифікації

Тут ми налаштовуємо публічний ключ FACEIO в конструкторі faceIO.
Цей компонент забезпечує біометричну аутентифікацію користувачів за допомогою розпізнавання обличчя та реєстрації за допомогою SDK FaceIO.
Користувачі можуть реєструвати свої біометричні дані та безпечно аутентифікуватися за допомогою FaceIO.

У директорії src/pages створіть файл Auth.tsx і введіть весь код із цього GitHub репозиторію.

Деякі фрагменти коду тут показують, як ми визначаємо схему валідації для інтеграції з FACEIO за допомогою yup у константі SignupSchema на const SignupSchema = yup.object().shape({});.
Yup — це будівельник схем для парсингу значень під час виконання та валідації.

Також ми визначаємо інтерфейси за допомогою FaceIODetails, а потім оголошуємо конструктор FACEIO глобально, використовуючи Public ID з вашої консолі FACEIO, та ініціалізуємо екземпляр FaceIO за допомогою useEffect

// Define validation schema using yup  
const SignupSchema = yup.object().shape({  
 name: yup.string().required("Ім'я обов'язкове"),  
 email: yup  
 .string()  
 .email("Невірна адреса електронної пошти")  
 .required("Електронна пошта обов'язкова"),  
});  
// Define interfaces  
interface FaceIODetails {  
 gender: string;  
 age: number;  
}  
interface FaceIOEnrollResponse {  
 facialId: string;  
 timestamp: string;  
 details: FaceIODetails;  
}  
interface FaceIOAuthenticateResponse {  
 facialId: string;  
 payload: Record;  
}  
interface FaceIO {  
 enroll(options: {  
 locale: string;  
 payload: { name: string; email: string };  
 }): Promise;  

authenticate(options: { locale: string }): Promise;  
}  

// Declare the faceIO constructor globally  
declare const faceIO: new (publicId: string) => FaceIO;  

type Iuser = {  
 name: string;  
 email: string;  
};  

const Auth: React.FC = () => {  
 const [faceio, setFaceio] = useState(null);  
 const [error, setError] = useState(null);  
 const navigate = useNavigate();  

// Initialize FaceIO instance  
 useEffect(() => {  
 const initializeFaceIO = () => {  
 try {  
 const faceioInstance = new faceIO("fioac691");  
 setFaceio(faceioInstance);  
 } catch (err: any) {  
 setError("Не вдалося ініціалізувати FaceIO: " + err.message);  
 }  
 };  
 initializeFaceIO();  
 }, []);

Основні можливості

  • Використовує React з react-hook-form для обробки форм та yup для валідації схем.
  • Інтегрує SDK FaceIO для реєстрації та аутентифікації.
  • Обробка помилок для різних кодів помилок, специфічних для FaceIO.
  • Перенаправлення користувачів на панель керування після успішної аутентифікації чи реєстрації.

Компонент CheckIn та CheckOut

Цей компонент надає функціональність для відстеження відвідувань, включаючи часи реєстрації та виїзду.

У директорії src/pages ми створюємо цю функціональність у файлі CheckInOut.tsx з таким кодом:

type AttendanceLogEntry = {  
 type: "Check-In" | "Check-Out";  
 time: string;  
};  

export default function CheckInOut() {  
 const [lastCheckIn, setLastCheckIn] = useState("--:-- --");  
 const [lastCheckOut, setLastCheckOut] = useState("--:-- --");  
 const [attendanceLog, setAttendanceLog] = useState([]);  
 const [isCheckedIn, setIsCheckedIn] = useState(false);  

const getCurrentTime = (): string => {  
 return new Date().toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", hour12: true });  
 };  

const handleCheckIn = (): void => {  
 const currentTime = getCurrentTime();  
 setLastCheckIn(currentTime);  
 setIsCheckedIn(true);  
 setAttendanceLog((prevLog) => [...prevLog, { type: "Check-In", time: currentTime }]);  
 };  

const handleCheckOut = (): void => {  
 const currentTime = getCurrentTime();  
 setLastCheckOut(currentTime);  
 setIsCheckedIn(false);  
 setAttendanceLog((prevLog) => [...prevLog, { type: "Check-Out", time: currentTime }]);  
 };

Отримайте повний код в цьому репозиторії.

Компонент Dashboard
З опціями навігації, цей компонент показує інформацію, специфічну для користувача, таку як поточний час, дата та ID працівника.

Для панелі керування введіть цей код у файл src/pages/Dashboard.tsx

import { Button } from "../Components/ui/button";  
import { Layout } from "../Components/Layout";  
import { Card, CardContent, CardHeader, CardTitle } from "../Components/ui/card";  
import { Clock, Calendar, User } from "lucide-react";  
import { useNavigate } from "react-router-dom";  

export default function Dashboard() {  
 const navigate = useNavigate();  

 return (  


Ласкаво просимо, John Doe  
 Дата                

 {new Date().toLocaleDateString()}  

 Час                

 {new Date().toLocaleTimeString([], {  
 hour: "2-digit",  
 minute: "2-digit",  
 hour12: true,  
 })}  

 ID працівника                
EMP1001
 navigate("/checkinout")}>    Check In/Out        {/*  navigate("/attendanceLog")}>    Переглянути журнал відвідувань     */}    
        );   } ```  - Тепер давайте реалізуємо функції Реєстрації та Вхід  ``` // Функція реєстрації  
 const handleEnroll = async (user: Iuser) => {    
 if (!faceio) {    
 setError("Екземпляр FaceIO не ініціалізовано.");    
 return;    
 }    
 try {    
 const response = await faceio.enroll({    
 locale: "auto",    
 payload: {    
 name: user.name,    
 email: user.email,    
 },    
 });    
 alert(    
 `Унікальний ID обличчя: ${response.facialId}\n` +    
 `Дата реєстрації: ${response.timestamp}\n` +    
 `Стать: ${response.details.gender}\n` +    
 `Приблизний вік: ${response.details.age}`    
 );    
 navigate("/dashboard");    
 } catch (err: any) {    
 handleError(err.message || "Невідома помилка");    
 }    
 };      
 // Функція входу  
 const handleAuthenticate = async () => {    
 if (!faceio) {    
 setError("Екземпляр FaceIO не ініціалізовано.");    
 return;    
 }    
 try {    
 const response = await faceio.authenticate({    
 locale: "auto",    
 });    
 console.log(    
 `Унікальний ID обличчя: ${response.facialId}\nPayload: ${JSON.stringify(    
 response.payload    
 )}`    
 );    
 navigate("/dashboard");    
 } catch (err: any) {    
 handleError(err.message || "Невідома помилка");    
 }    
 }; ```  Щоб підвищити надійність нашої [інтеграції FACEIO](https://faceio.net/integration-guide), ми можемо реалізувати централізовану функцію обробки помилок.
Нижче наведено приклад такої функції, яку ми назвали `handleError`, що відображає конкретні коди помилок у зручні для користувача повідомлення.

const handleError = (errCode: string) => {
const errorMessages: Record = {
PERMISSIONREFUSED: "Доступ до відеопотоку камери був відхилений кінцевим користувачем.",
NO
FACESDETECTED: "Не було виявлено облич під час процесу реєстрації або автентифікації.",
UNRECOGNIZED
FACE: "Неузгоджене обличчя у цьому додатку Facial Index.",
MANYFACES: "Під час сканування було виявлено два або більше облич.",
FACE
DUPLICATION: "Користувач вже зареєстрований. Не можна зареєструватися знову.",
MINORSNOTALLOWED: "Неповнолітні не можуть зареєструватися в цьому додатку.",
PADATTACK: "Детектовано атаку на підробку (Spoof) під час процесу сканування.",
FACE
MISMATCH: "Лінії обличчя не співпадають.",
WRONGPINCODE: "Невірний PIN-код під час автентифікації.",
PROCESSINGERR: "Помилка на стороні сервера.",
UNAUTHORIZED: "Ваш додаток не авторизований. Перевірте ваш публічний ID.",
TERMS
NOTACCEPTED: "Умови використання не були прийняті.",
UI
NOTREADY: "Віджет FaceIO не зміг бути доданий до DOM.",
SESSION
EXPIRED: "Термін дії клієнтської сесії завершився. Перезапустіть процес.",
TIMEOUT: "Час виконання операції вичерпано.",
TOOMANYREQUESTS: "Забагато запитів. Оновіть ваш додаток для підвищення потужності.",
EMPTYORIGIN: "Заголовок Origin або Referer HTTP запиту порожній або відсутній.",
FORBIDDDEN
ORIGIN: "Домену заборонено використовувати FaceIO.",
FORBIDDDENCOUNTRY: "Країні заборонено використовувати FaceIO.",
SESSION
INPROGRESS: "Інша сесія вже триває.",
NETWORK
IO: "Помилка з’єднання з мережею при використанні FaceIO.",
};
const message = errorMessages[errCode] || "Сталася невідома помилка.";
setError(message);
console.error("FaceIO Error:", message);
};
```

Далі, щоб інтегрувати FACEIO в інтерфейс користувача, ми розробили просту форму для реєстрації з полями для Імені та Email та кнопками для Реєстрації та Входу.
Ось JSX код для форми:


Check In
    Name            {errors.name && (    
{errors.name.message}
    )}    
    Email            {errors.email && (    
{errors.email.message}
    )}    
    Register        
    Login        
   {error && 
{error}
} 

Об'єднуємо все разом
Щоб з'єднати всі функціональності, введіть цей код у файл App.tsx в директорії src.

import Auth from './pages/Auth';   
import CheckInOut from './pages/CheckInOut';   
import Dashboard from './pages/Dashboard';   
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';   

function App() {    
    return (            
    } />    
    }/>    
    }/>            
    );   
}    

export default App; 

Налаштування FACEIO

Зареєструйтесь на FACEIO і увійдіть в консоль. Щоб інтегрувати FACEIO у додаток, який ви створюєте, вам потрібно створити додаток і отримати деталі, такі як ID додатка та API ключ, які будуть знаходитися у вашому файлі env та підключатимуться до FACE при запуску додатка.

Дотримуйтесь цих кроків, щоб почати.

У консоль FACEIO перейдіть у розділ Dashboard у лівій панелі та натисніть кнопку NEW FACEIO APPLICATION
pic

Це відкриє майстра додатка FACEIO, де ви введете деталі нового додатка, такі як:

  • Alias додатка: Це назва додатка (щось, що ви зможете легко запам'ятати) і це обов'язковий крок для продовження.
  • URL політики конфіденційності додатка: Це рекомендовано, якщо у вас є доступний документ.
  • URL умов використання додатка: Це необов'язково.

Після введення назви натискайте кнопку NEXT, як показано нижче.
pic

Наступний крок — вибір рушія для розпізнавання обличчя для вашого додатка, з яким ви хочете інтегрувати FACEIO.

Рушій для розпізнавання облич — це критичний ключовий компонент, який відповідає за відображення обличчя кожного зареєстрованого користувача в реальному часі у математичний вектор ознак, що також відомий як біометричний хеш, який зберігається в ізольованому бінарному індексі.

Для цього використання ми будемо використовувати PixLab, тому виберіть його, натиснувши на модальне вікно.
pic

Далі прокрутіть вниз і виберіть регіон хмарного сховища для індексу облич та метаданих додатка, а потім натисніть кнопку NEXT, щоб продовжити.
pic

Наступний крок — переглянути стандартні налаштування безпеки, які рекомендуються для більшості додатків.
Ви можете ознайомитись з Посібником з найкращих практик безпеки FACEIO для загального огляду практик безпеки та рекомендацій.

Після того як ви переглянете налаштування безпеки, натисніть кнопку NEXT, щоб продовжити.

pic

Також через консоль FACEIO, в менеджері додатків, ви можете активувати опцію, яка забороняє тому ж користувачу реєструватись більше одного разу при використанні вашого додатка.

Наступний крок після цього (не хвилюйтесь, майже все) — налаштування віджету FACEIO.
Ви можете вибрати тему, яка відповідатиме дизайну вашого сайту, а також додати посилання на URL вашого сайту чи логотипу додатка — це буде відображатися в верхньому лівому куті віджету, коли ваш додаток працює, і користувач захоче розпочати процес аутентифікації за допомогою обличчя.

pic

Потім перевірте введену інформацію перед поданням і створенням нового додатку FACEIO та виберіть відповідний тарифний план для цього додатку, враховуючи ваш бюджет.

pic

Наступним кроком погодьтеся з умовами обслуговування та натисніть кнопку CREATE FACEIO APPLICATION

pic

Після цього з'явиться модальне вікно успішного створення нового додатку FACEIO.

pic

Далі завантажиться інформаційна панель для цього нового додатку з даними, такими як Public ID додатку, API Key, посібники з інтеграції та іншою необхідною інформацією.

pic

Після створення вашого додатку, просто імплементуйте fio.js на вашому вебсайті або веб-додатку, щоб впровадити аутентифікацію за обличчям для ваших користувачів.

Скопіюйте Public ID додатку і вставте його в файл env в кореневій директорії проєкту.

Public_Id = "your-app-ID"

Запуск додатку

Щоб запустити веб-додаток, введіть команду npm run dev у вашому терміналі, а потім відкрийте це посилання у вашому браузері: http://localhost:5173/

Після цього завантажиться система відвідувань, як показано нижче:

pic

Введіть ваше ім’я та електронну пошту, а потім натисніть Register, що ініціює процес аутентифікації за обличчям через FACEIO перед тим, як ви зможете доступитись до інших частин системи відвідувань і зафіксувати своє відвідування.

pic

Вам також буде запропоновано встановити PIN-код для додатку.

pic

Після успішної аутентифікації через FACEIO буде записано та відображено унікальний ID обличчя, дату реєстрації, стать та орієнтовний вік користувача вашого додатку.

pic

Це додає додатковий рівень безпеки до додатку та запобігає реєстрації декількох відвідувань одним і тим же користувачем.

Тепер ви можете переглядати інформаційну панель та натискати кнопку Check In/Out для реєстрації вашого відвідування.

Система відвідувань потім реєструє дату, час та ID співробітника для входу.

pic

Тепер натисніть кнопку Check In, щоб зареєструвати вхід.

pic

Після цього ви можете переглянути журнал відвідувань, як показано нижче

pic

Ви також можете вийти, натиснувши кнопку Check Out

pic

І ось, ми створили систему відвідувань з аутентифікацією за обличчям для кращої безпеки.

З цим додатком ви можете додатково розширити його для відстеження відвідувань співробітників в організації, як це передбачено у випадку використання цього додатку.

Клонувати репозиторій

git clone https://github.com/Tabintel/Attendance_system.git

Встановіть залежності

npm install

Потім запустіть додаток і відкрийте URL у вашому браузері.
http://localhost:5173/

npm run dev

Ви також можете спробувати додаток за допомогою живого посилання тут

Підсумки

У цій статті ми побудували просту систему відвідувань для аутентифікації за обличчям, використовуючи React та FACEIO. Використовуючи передові функції безпеки FACEIO, ми створили безпечне та захищене від шахрайства рішення, яке можна розширити для використання в робочих місцях, школах або будь-якому середовищі, де необхідне відстеження відвідувань.

Також відвідайте форум FACEIO для підтримки та обговорень від спільноти.

Щасливого кодування!

Перекладено з: Building an Attendance System Powered by Face Recognition Using React and FACEIO

Leave a Reply

Your email address will not be published. Required fields are marked *