身份驗證是任何處理使用者資料或個人化體驗的應用程式的關鍵部分。在 MERN 堆疊(MongoDB、Express、React、Node.js)中,建立強大的身份驗證系統需要了解後端和前端流程。本指南將引導您完成身份驗證設置,涵蓋關鍵概念、實際範例和最佳實踐。
了解身份驗證方法可以幫助您確定最適合您的應用程式的方法:
後端處理使用者註冊、登入和驗證邏輯。
先安裝必要的軟體包:
npm install express mongoose bcrypt jsonwebtoken dotenv
使用 Mongoose 建立一個用於安全儲存使用者憑證的架構:
const mongoose = require("mongoose"); const bcrypt = require("bcrypt"); const UserSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true }, }); // Hash password before saving UserSchema.pre("save", async function (next) { if (!this.isModified("password")) return next(); this.password = await bcrypt.hash(this.password, 10); next(); }); module.exports = mongoose.model("User", UserSchema);
實現註冊與登入路由:
const express = require("express"); const User = require("./models/User"); const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken"); const router = express.Router(); const SECRET_KEY = "your_secret_key"; // Use dotenv in production // Register Route router.post("/register", async (req, res) => { const { username, email, password } = req.body; try { const user = new User({ username, email, password }); await user.save(); res.status(201).json({ message: "User registered successfully" }); } catch (err) { res.status(500).json({ error: "Error registering user" }); } }); // Login Route router.post("/login", async (req, res) => { const { email, password } = req.body; try { const user = await User.findOne({ email }); if (!user) return res.status(404).json({ error: "User not found" }); const isPasswordValid = await bcrypt.compare(password, user.password); if (!isPasswordValid) return res.status(401).json({ error: "Invalid password" }); const token = jwt.sign({ id: user._id }, SECRET_KEY, { expiresIn: "1h" }); res.status(200).json({ message: "Login successful", token }); } catch (err) { res.status(500).json({ error: "Error logging in" }); } }); module.exports = router;
透過驗證令牌來保護路由:
const jwt = require("jsonwebtoken"); function authenticateToken(req, res, next) { const token = req.headers["authorization"]; if (!token) return res.status(403).json({ error: "Access denied" }); jwt.verify(token, "your_secret_key", (err, user) => { if (err) return res.status(403).json({ error: "Invalid token" }); req.user = user; next(); }); } module.exports = authenticateToken;
在安全路線中使用它:
const express = require("express"); const authenticateToken = require("./middleware/authenticateToken"); const router = express.Router(); router.get("/profile", authenticateToken, (req, res) => { res.json({ message: `Welcome, User ${req.user.id}` }); });
React 前端管理使用者會話並與後端通訊。
使用axios處理API請求:
npm install axios
使用 React Context 和鉤子來管理驗證:
import React, { createContext, useState, useContext } from "react"; import axios from "axios"; const AuthContext = createContext(); export const useAuth = () => useContext(AuthContext); export const AuthProvider = ({ children }) => { const [user, setUser] = useState(null); const login = async (email, password) => { const { data } = await axios.post("/api/login", { email, password }); localStorage.setItem("token", data.token); setUser(data.user); }; const logout = () => { localStorage.removeItem("token"); setUser(null); }; return ( <AuthContext.Provider value={{ user, login, logout }}> {children} </AuthContext.Provider> ); };
重定向未經身份驗證的使用者:
import React from "react"; import { Navigate } from "react-router-dom"; import { useAuth } from "./AuthProvider"; const ProtectedRoute = ({ children }) => { const { user } = useAuth(); return user ? children : <Navigate to="/login" />; }; export default ProtectedRoute;
在健身應用程式中,使用者希望即使在頁面重新載入後,他們的會話也能持續存在。如果沒有適當的令牌儲存和驗證,theyu2019d 必須重複登入。
npm install express mongoose bcrypt jsonwebtoken dotenv
MERN 中的身份驗證是後端邏輯和前端管理的混合。透過遵循最佳實踐,您可以建立安全、可擴展且使用者友好的身份驗證系統。無論是社交平台、電子商務網站還是 SaaS 應用程序,掌握身份驗證都可以確保無縫的用戶體驗。
我們正在建立一個創新蓬勃發展、技術愛好者共同成長的社群。與我們一起踏上啟發、學習和創造的旅程!
?探索更多:
?追蹤我們,獲得每日靈感:
? thecampuscoders.com
?探索資源、教程和更新,為您的技術之旅提供動力!
✨ 讓我們一起合作、學習、共創未來!
有想法或建議嗎?聯絡我們,成為非凡事業的一部分!
?聯絡我們: deepak@thecampuscoders.com
以上是掌握 MERN 中的身份驗證:綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!