」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用臉部身份驗證建立安全的員工儀表板:綜合 Next.js 教程

使用臉部身份驗證建立安全的員工儀表板:綜合 Next.js 教程

發佈於2024-07-31
瀏覽:482

Are you ready to revolutionize your workplace management? In this comprehensive tutorial, we're diving deep into creating a state-of-the-art employee dashboard that leverages facial authentication. We'll be using some of the hottest tools in web development: Next.js, FACEIO, and Shadcn UI. By the end of this guide, you'll have a sleek, secure dashboard that'll make your employees feel like they're living in the future!

What You'll Need Before We Start

Before we dive in, let's make sure you've got all your ducks in a row:

  • Node.js installed on your machine
  • npm or yarn (whichever floats your boat)

Got all that? Great! Let's get this show on the road.

Faceio Authentication

Setting Up Your Project: The First Steps

Step 1: Kickstarting Your Next.js Project

First things first, let's create our Next.js project. Open up your terminal and type in these magic words:

npx create-next-app@latest faceio-app
cd faceio-app

You'll be asked a few questions. Here's how to answer them:

  • TypeScript? Heck yes!
  • ESLint? Absolutely!
  • Tailwind CSS? You bet!
  • src/ directory? Nah, we're good.
  • App Router? Yes, please!
  • Customize default import alias? We'll pass on this one.

Step 2: Gathering Your Tools

Now, let's grab all the goodies we need. Run this command to install our dependencies:

npm install @faceio/fiojs @shadcn/ui class-variance-authority clsx tailwind-merge

Step 3: Setting Up Your Secret Sauce

Create a file called .env.local in your project's root. This is where we'll keep our secret FACEIO app ID:

NEXT_PUBLIC_FACEIO_APP_ID=your-super-secret-faceio-app-id

Remember to replace 'your-super-secret-faceio-app-id' with your actual FACEIO application ID. Keep it safe!

Step 4: File Structure

Your project structure should look like this:

faceio-app/
├── app/
│   ├── layout.tsx
│   ├── page.tsx
│   └── components/
│       ├── FaceAuth.tsx
│       └── EmployeeDashboard.tsx
├── public/
├── .env.local
├── next.config.js
├── package.json
├── tsconfig.json
└── tailwind.config.js

Step 5: Sprucing Up Tailwind CSS

Time to give Tailwind a makeover. Update your tailwind.config.js file with this fancy configuration:

/** @type {import('tailwindcss').Config} */
module.exports = {
  darkMode: ["class"],
  content: [
    './app/**/*.{ts,tsx}',
  ],
  theme: {
    container: {
      center: true,
      padding: "2rem",
      screens: {
        "2xl": "1400px",
      },
    },
    extend: {
      colors: {
        border: "hsl(var(--border))",
        input: "hsl(var(--input))",
        ring: "hsl(var(--ring))",
        background: "hsl(var(--background))",
        foreground: "hsl(var(--foreground))",
        primary: {
          DEFAULT: "hsl(var(--primary))",
          foreground: "hsl(var(--primary-foreground))",
        },
        secondary: {
          DEFAULT: "hsl(var(--secondary))",
          foreground: "hsl(var(--secondary-foreground))",
        },
        destructive: {
          DEFAULT: "hsl(var(--destructive))",
          foreground: "hsl(var(--destructive-foreground))",
        },
        muted: {
          DEFAULT: "hsl(var(--muted))",
          foreground: "hsl(var(--muted-foreground))",
        },
        accent: {
          DEFAULT: "hsl(var(--accent))",
          foreground: "hsl(var(--accent-foreground))",
        },
        popover: {
          DEFAULT: "hsl(var(--popover))",
          foreground: "hsl(var(--popover-foreground))",
        },
        card: {
          DEFAULT: "hsl(var(--card))",
          foreground: "hsl(var(--card-foreground))",
        },
      },
      borderRadius: {
        lg: "var(--radius)",
        md: "calc(var(--radius) - 2px)",
        sm: "calc(var(--radius) - 4px)",
      },
      keyframes: {
        "accordion-down": {
          from: { height: 0 },
          to: { height: "var(--radix-accordion-content-height)" },
        },
        "accordion-up": {
          from: { height: "var(--radix-accordion-content-height)" },
          to: { height: 0 },
        },
      },
      animation: {
        "accordion-down": "accordion-down 0.2s ease-out",
        "accordion-up": "accordion-up 0.2s ease-out",
      },
    },
  },
  plugins: [require("tailwindcss-animate")],
}

Building the Heart of Your Dashboard

Step 1: Crafting the FaceAuth Component

Let's create the star of our show - the FaceAuth component. Create a new file app/components/FaceAuth.tsx and paste in this code:

import { useEffect } from 'react';
import faceIO from '@faceio/fiojs';
import { Button, Card, CardHeader, CardTitle, CardContent } from '@shadcn/ui';
import { useToast } from '@shadcn/ui';

interface FaceAuthProps {
  onSuccessfulAuth: (data: any) => void;
}

const FaceAuth: React.FC = ({ onSuccessfulAuth }) => {
  const { toast } = useToast();

  useEffect(() => {
    const faceio = new faceIO(process.env.NEXT_PUBLIC_FACEIO_APP_ID);

    const enrollNewUser = async () => {
      try {
        const userInfo = await faceio.enroll({
          locale: 'auto',
          payload: {
            email: '[email protected]',
            pin: '12345',
          },
        });
        toast({
          title: "Success!",
          description: "You're now enrolled in the facial recognition system!",
        });
        console.log('User Enrolled!', userInfo);
      } catch (errCode) {
        toast({
          title: "Oops!",
          description: "Enrollment failed. Please try again.",
          variant: "destructive",
        });
        console.error('Enrollment Failed', errCode);
      }
    };

    const authenticateUser = async () => {
      try {
        const userData = await faceio.authenticate();
        toast({
          title: "Welcome back!",
          description: "Authentication successful.",
        });
        console.log('User Authenticated!', userData);
        onSuccessfulAuth({
          name: 'John Doe',
          position: 'Software Developer',
          department: 'Engineering',
          photoUrl: 'https://example.com/john-doe.jpg',
        });
      } catch (errCode) {
        toast({
          title: "Authentication failed",
          description: "Please try again or enroll.",
          variant: "destructive",
        });
        console.error('Authentication Failed', errCode);
      }
    };

    const enrollBtn = document.getElementById('enroll-btn');
    const authBtn = document.getElementById('auth-btn');

    if (enrollBtn) enrollBtn.onclick = enrollNewUser;
    if (authBtn) authBtn.onclick = authenticateUser;

    return () => {
      if (enrollBtn) enrollBtn.onclick = null;
      if (authBtn) authBtn.onclick = null;
    };
  }, [toast, onSuccessfulAuth]);

  return (
    
      
        Facial Authentication
      
      
        
        
      
    
  );
};

export default FaceAuth;

Step 2: Building the EmployeeDashboard Component

Now, let's create the dashboard that our employees will see. Create app/components/EmployeeDashboard.tsx:

import { useState } from 'react';
import { Card, CardHeader, CardTitle, CardContent } from '@shadcn/ui';
import { Button, Avatar, Badge, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shadcn/ui';
import FaceAuth from './FaceAuth';

interface EmployeeData {
  name: string;
  position: string;
  department: string;
  photoUrl: string;
}

const EmployeeDashboard: React.FC = () => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [employeeData, setEmployeeData] = useState(null);

  const handleSuccessfulAuth = (data: EmployeeData) => {
    setIsAuthenticated(true);
    setEmployeeData(data);
  };

  const mockAttendanceData = [
    { date: '2024-07-14', timeIn: '09:00 AM', timeOut: '05:30 PM' },
    { date: '2024-07-13', timeIn: '08:55 AM', timeOut: '05:25 PM' },
    { date: '2024-07-12', timeIn: '09:05 AM', timeOut: '05:35 PM' },
  ];

  return (
    
{!isAuthenticated ? ( ) : ( Employee Profile

{employeeData?.name}

{employeeData?.position}

{employeeData?.department}
Quick Actions Attendance Records Date Time In Time Out {mockAttendanceData.map((record, index) => ( {record.date} {record.timeIn} {record.timeOut} ))}
> )}
); }; export default EmployeeDashboard;

Step 3: Bringing It All Together

Finally, let's update our main page to show off our hard work. Update app/page.tsx:

import EmployeeDashboard from './components/EmployeeDashboard';

export default function Home() {
  return (
    
); }

Now, let's set up the layout that'll wrap our entire app. Add this code: app/layout.tsx

import './globals.css'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: 'Employee Dashboard with Facial Authentication',
  description: 'A cutting-edge employee dashboard featuring facial recognition for secure authentication and efficient workplace management.',
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    
      
        

Faceio Solutions

{children}

© 2024 Faceio . All rights reserved.

) }

This layout is like the frame of a house - it provides structure for your entire app. It includes a header with your company name, a main content area where your dashboard will appear, and a footer. Plus, it sets up some SEO magic with metadata!

Key Privacy and Security Practices for FACEIO Integration

Privacy by Design

  • Use access controls, user consent, and opt-out options to protect privacy.

Meaningful Consent

  • Ensure users are aware of data collection.
  • Offer freedom of choice and control over their data.
  • Allow revocation of consent and data deletion anytime.

Best Practices

  • Obtain clear and appropriate consent, especially for minors.
  • Make consent requests easy to find and understand.
  • Avoid auto-enrollment and unauthorized enrollments.
  • Notify users before collecting biometric data.
  • Follow legal data privacy requirements.

Data Security

  • Delete user data upon account deletion.
  • Maintain strong data retention and disposal practices.
  • Implement and review security safeguards regularly.

For more details, refer to FACEIO Best Practices.

Key Security Considerations for FACEIO Integration

Security by Design

  • Application security is essential to preserve user trust.
  • Follow FACEIO's security best practices to mitigate risks.

Core Security Features

  1. Reject Weak PINs

    • Prevent weak PINs like 0000 or 1234.
    • Default: No.
  2. Prevent Duplicate Enrollments

    • Stops users from enrolling multiple times.
    • Default: No.
  3. Protect Against Deep-Fakes

    • Detects and blocks spoofing attempts.
    • Default: No.
  4. Forbid Minor Enrollments

    • Blocks users under 18 from enrolling.
    • Default: No.
  5. Require PIN for Authentication

    • Requires PIN code for each authentication.
    • Default: Yes.
  6. Enforce Unique PINs

    • Ensures each user's PIN is unique.
    • Default: No.
  7. Ignore Obscured Faces

    • Discards faces under poor lighting or partially masked.
    • Default: Yes.
  8. Reject Missing Headers

    • Blocks instantiation without proper HTTP headers.
    • Default: Yes.
  9. Restrict Instantiation

    • Limits to specific domains and countries.
    • Default: No.
  10. Enable Webhooks

    • Notifies your backend of FACEIO events.
    • Default: No.

For more details, refer to FACEIO Security Best Practices.

Real-World Applications: Where Can You Use This?

Now that we've built this awesome dashboard, you might be wondering, "Where can I use this in the real world?" Well, let me tell you, the possibilities are endless! Here are just a few ideas:

  1. Office Management: Say goodbye to old-school punch cards! This system can revolutionize how you track attendance, control access to different areas of your office, and manage employee information.

  2. Security Systems: Imagine a world where your office is Fort Knox, but without the hassle. This facial recognition system can be the cornerstone of a robust security protocol.

  3. Customer Service Kiosks: Picture this - a customer walks up to a kiosk, it recognizes them instantly, and provides personalized service. It's not science fiction anymore!

What's Next? The Sky's the Limit!

Congratulations, tech wizard! You've just built a cutting-edge employee dashboard with facial authentication. But why stop here? The beauty of this system is its flexibility. Here are some ideas to take it to the next level:

  • Implement real-time notifications for important updates
  • Add detailed reporting features for HR
  • Integrate with other systems like payroll or project management tools

Remember, in the world of tech, the only limit is your imagination (and maybe your caffeine intake).

So, what do you think? Are you ready to bring your workplace into the future? Give this project a try and let me know how it goes. I'd love to hear about your experiences, any cool features you add, or any challenges you face along the way.

Happy coding, and may your facial recognition never mistake you for your office plant!

版本聲明 本文轉載於:https://dev.to/vyan/building-a-secure-employee-dashboard-with-facial-authentication-a-comprehensive-nextjs-tutorial-2c4g?1如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 如何將 JavaScript 日期物件增加一天?
    如何將 JavaScript 日期物件增加一天?
    將 JavaScript 日期對象增加一天您有一個 Date 對象,並希望使用 JavaScript 的 Date 對象將其增加一天。這是針對您的程式碼的改進解決方案:將當前程式碼替換為以下程式碼,以向 Date 物件添加一天:var date = new Date(); // add a day ...
    程式設計 發佈於2024-12-23
  • 我應該在呼叫 `condition_variable.notify_one()` 之前取得鎖定嗎?
    我應該在呼叫 `condition_variable.notify_one()` 之前取得鎖定嗎?
    在呼叫condition_variable.notify_one()之前何時應該取得鎖? 在多執行緒程式設計中,condition_variables用於向等待執行緒發出訊號已滿足特定條件。雖然在呼叫condition_variable.wait()之前需要持有鎖,但在呼叫notify_one()之...
    程式設計 發佈於2024-12-23
  • 如何使用 jQuery 將 Onclick 事件附加到動態新增的元素?
    如何使用 jQuery 將 Onclick 事件附加到動態新增的元素?
    如何使用 jQuery 將 Onclick 事件綁定到動態新增的 HTML 元素使用 jQuery 時,經常需要動態新增 HTML 元素頁面。在這種情況下,您可能需要將事件處理程序附加到這些元素。然而,將事件處理程序附加到頁面載入後新增的元素可能具有挑戰性。 問題和先前的解決方案傳統上,可以使用 ....
    程式設計 發佈於2024-12-23
  • 在 Pygame 中載入資源時如何修復“FileNotFoundError”?
    在 Pygame 中載入資源時如何修復“FileNotFoundError”?
    使用Pygame 載入資源:解決「FileNotFoundError」當嘗試在Pygame 中載入圖片或聲音等外部資源時,您可能會遇到“FileNotFoundError:沒有這樣的檔案或目錄”錯誤。此問題通常是由於資源檔案路徑不正確造成的,特別是當路徑相對於目前工作目錄時。 解決方案:設定工作目錄...
    程式設計 發佈於2024-12-23
  • Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?
    Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?
    Go 泛型中調用聯合約束的方法在Go 泛型(v1.18)中,你可能會遇到限制類型聯合約束的類型將參數類型轉換為實現統一介面的類型。然而,無法在受約束類型之間呼叫共享方法引起了人們對此類約束的實用性的擔憂。 考慮以下程式碼:type A struct {} type B struct {} type ...
    程式設計 發佈於2024-12-23
  • 如何在 TypeScript 中執行執行時間介面類型檢查?
    如何在 TypeScript 中執行執行時間介面類型檢查?
    TypeScript 中的介面類型檢查在TypeScript 中,您可能會遇到這樣的場景:在執行時間確定物件是否符合預定義介面至關重要。雖然利用instanceof關鍵字進行類別類型檢查很簡單,但將其應用於介面卻提出了挑戰。 傳統方法(例如依賴instanceof運算子)被證明是無效的,因為介面在編...
    程式設計 發佈於2024-12-23
  • 如何使用逾時取消長時間運行的 Python 函數?
    如何使用逾時取消長時間運行的 Python 函數?
    用超時取消長時間運行的函數呼叫執行包含可能停頓函數的複雜腳本時,需要提供一種方法如果這些函數超過指定的執行時間,則終止它們。這可確保腳本不會變得無回應或無限期地卡住。 在 Python 中,利用訊號包(在 UNIX 系統上可用)為該問題提供了解決方案。透過註冊訊號處理程序,您可以設定函數呼叫的逾時。...
    程式設計 發佈於2024-12-23
  • React 效能最佳化技術:記憶化、延遲載入等
    React 效能最佳化技術:記憶化、延遲載入等
    构建现代 Web 应用程序时,性能是关键。用户期望应用程序快速、响应灵敏,即使是轻微的延迟也会导致沮丧。 React 虽然功能强大,但有时会遇到性能瓶颈,尤其是当应用程序规模和复杂性不断增长时。幸运的是,有多种技术可以优化性能,包括记忆、延迟加载等等。 在本指南中,我们将详细介绍一些优化 React...
    程式設計 發佈於2024-12-23
  • Java 中初始大小設定如何影響 ArrayList 效能?
    Java 中初始大小設定如何影響 ArrayList 效能?
    了解ArrayList 的初始大小設定在Java 中,ArrayList 類別允許您在實例化期間指定初始大小,確保記憶效率。但是,區分初始大小和清單容量非常重要。 雖然初始大小決定清單中元素的初始數量,但它不會在特定索引處預先分配空間。相反,它定義了底層數組的容量,使其能夠容納更多元素,而無需在低索...
    程式設計 發佈於2024-12-23
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-23
  • 如何根據物件的ID屬性有效率地尋找數組條目?
    如何根據物件的ID屬性有效率地尋找數組條目?
    根據物件屬性識別數組條目考慮一個物件數組,每個物件都擁有一個「ID」屬性。為了找到與變數「$v」中儲存的特定「ID」值相對應的條目,我們探索了幾種方法:1。迭代搜尋這涉及順序迭代數組,將每個物件的「ID」屬性與所需值「$v」進行比較。 $item = null; foreach($array as ...
    程式設計 發佈於2024-12-23
  • 參數化單元測試如何簡化 Python 測試產生?
    參數化單元測試如何簡化 Python 測試產生?
    Python 中的參數化單元測試:動態測試產生指南在軟體開發中,測試對於確保可靠性和可靠性起著至關重要的作用。我們的程式碼的準確性。單元測試尤其涉及為特定功能或模組建立單獨的測試。然而,在處理大型資料集或複雜的測試場景時,為每個參數手動編寫測試變得很費力。 參數化測試:動態測試產生的解決方案參數化測...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中從 URL 中提取子網域?
    如何在 PHP 中從 URL 中提取子網域?
    在 PHP 中從 URL 檢索子網域在 PHP 中從 URL 檢索子網域識別 URL 中的子網域可能是各種 Web 應用程式中的常見任務。本文探討 PHP 從給定 URL 中提取子網域的功能。 提取子網域的函數function getSubdomain($url) { // Split the ...
    程式設計 發佈於2024-12-23
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-23
  • 如何停用 Console.log 語句以在 JavaScript 中進行高效程式碼測試?
    如何停用 Console.log 語句以在 JavaScript 中進行高效程式碼測試?
    禁用Console.log 語句以實現高效代碼測試在JavaScript 開發中,console.log 語句可能會在測試期間使控制台窗口變得混亂,導致很難確定具體問題。要解決這個問題,請考慮使用以下方法輕鬆停用所有console.log 語句:重新定義Console.log 函數:透過將conso...
    程式設計 發佈於2024-12-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3