Nenechávejte návštěvníky svého webu na holičkách – nechte je resetovat své heslo, pokud ho zapomněli.

Autentizační systémy hrají klíčovou roli při poskytování bezproblémové a bezpečné uživatelské zkušenosti. Pracovní postup ověřování obvykle zahrnuje dva procesy: přihlášení a přihlášení.

S rostoucím počtem online služeb si lidé vytvářejí účty a každý účet vyžaduje jedinečné přihlašovací údaje. To však usnadňuje zapomenutí nebo záměnu přihlašovacích údajů. K vyřešení tohoto problému by vaše aplikace měla implementovat funkci resetování hesla, která uživateli umožní pohodlně a bezpečně resetovat heslo.

Nastavte projekt React

Pracovní postup pro resetování hesla můžete implementovat různými způsoby – neexistuje univerzální standard, který by měla každá aplikace dodržovat. Místo toho byste měli zvolený přístup přizpůsobit tak, aby vyhovoval specifickým potřebám vaší aplikace.

Pracovní postup, o kterém se zde dozvíte, zahrnuje následující kroky:

Začít, rychle zavést projekt React. Dále nainstalujte Axios, knihovna požadavků HTTP JavaScriptu.

instagram viewer
npm nainstalovat axios

Zde najdete kód projektu úložiště GitHub.

Vytvořte přihlašovací komponentu

V adresáři src vytvořte nový komponenty/Login.js soubor a přidejte následující kód. Začněte definováním procesu resetování hesla:

import axios z"axios";
import Reagovat, { useState } z"reagovat";
import { useContext } z"reagovat";
import { RecoveryContext } z"../Aplikace";
import"./global.component.css";

vývoznívýchozífunkcePřihlásit se() {
konst { setPage, setOTP, setEmail } = useContext (RecoveryContext);
konst [userEmail, setUserEmail] = useState("");

funkceodeslatOtp() {
-li (e-mail uživatele) {
axios.get(` http://localhost: 5000/kontrolní_e-mail? email=${userEmail}`).pak((Odezva) => {
-li (stav.odpověď 200) {
konst OTP = Matematika.podlaha(Matematika.random() * 9000 + 1000);
řídicí panel.log (OTP);
setOTP(OTP);
setEmail (uživatelský e-mail);

axios.post(" http://localhost: 5000/odeslat_e-mail", {
jednorázové heslo,
recipient_email: userEmail,
})
.pak(() => setPage("otp"))
.chytit(řídicí panel.log);
} jiný {
upozornění ("Uživatel s tímto e-mailem neexistuje!");
řídicí panel.log (response.data.message);
}}).chytit(řídicí panel.log);
} jiný {
upozornění ("Zadejte prosím svůj email");
}}

Tento kód vytvoří funkci, která odešle jednorázové heslo (OTP) na e-mailovou adresu uživatele. Nejprve ověří uživatele kontrolou jeho e-mailu v databázi před vygenerováním a odesláním OTP. Nakonec aktualizuje uživatelské rozhraní pomocí stránky OTP.

Dokončete přihlašovací komponentu přidáním kódu pro vykreslení přihlašovacího prvku formuláře JSX:

vrátit se (

Přihlášení</h2>


E-mailem:
"e-mailem" value={userEmail} onChange={(e) => { setUserEmail (e.target.value) }} />

Heslo:
"Heslo" />

Vytvořte komponentu OTP Verification

Chcete-li zajistit platnost kódu zadaného uživatelem, musíte jej porovnat s kódem zaslaným na jeho e-mail.

Vytvoř nový komponenty/OTPInput.js soubor a přidejte tento kód:

import Reagovat, { useState, useContext, useEffect } z"reagovat";
import { RecoveryContext } z"../Aplikace";
import axios z"axios";
import"./global.component.css";

vývoznívýchozífunkceOTPInput() {
konst { email, otp, setPage } = useContext (RecoveryContext);
konst [OTPinput, setOTPinput] = useState( "");

funkceověřitOTP() {
-li (parseInt(OTPinput) otp) {
setPage("resetovat");
} jiný {
upozornění ("Kód, který jste zadali, není správný, zkuste znovu odeslat odkaz");
}
}

Kód vytváří komponentu React, kde uživatelé ověřují svůj OTP kód. Zkontroluje, zda se zadaný kód shoduje s kódem uloženým v kontextu objektu. Pokud je platné, zobrazí se stránka pro resetování hesla. Naopak zobrazuje výstrahu, která uživatele vyzve, aby to zkusil znovu nebo znovu odeslal jednorázové heslo.

Kód můžete zkontrolovat v tomto úložiště který implementuje funkci pro opětovné zasílání jednorázových hesel a časovač vypršení platnosti kódu OTP.

Nakonec vyrenderujte vstupní prvky JSX.

vrátit se (

Ověření e-mailem</h3>

Na váš e-mail jsme zaslali ověřovací kód.</p>


"text" value={OTPinput} onChange={(e) => { setOTPinput (e.target.value) }} />

Vytvořte komponentu Reset Password Component

Vytvoř nový komponenty/Reset.js soubor a přidejte tento kód:

import Reagovat, {useState, useContext} z"reagovat";
import { RecoveryContext } z"../Aplikace";
import axios z"axios";
import"./global.component.css";

vývoznívýchozífunkceResetovat() {
konst [heslo, setPassword] = useState("");
konst { setPage, email } = useContext (RecoveryContext);

funkcezměnit heslo() {
-li (Heslo) {
Snaž se {
axios.put(" http://localhost: 5000/aktualizace-hesla", {
email: email,
newPassword: heslo,
}).pak(() => setPage("přihlásit se"));

vrátit se upozornění ("Heslo bylo úspěšně změněno, přihlaste se prosím!");
} chytit (chyba) {řídicí panel.log (chyba);}}
vrátit se upozornění ("Zadejte prosím své nové heslo");
 }

vrátit se (


Změnit heslo </h2>


Nové heslo:
typ="Heslo"
zástupný symbol="..."
požadované =""
value={password}
onChange={(e) => setPassword (e.target.value)} />

Tento kód vykreslí formulář, který uživatelům umožňuje zadat nové heslo. Když uživatel klikne na odeslat, odešle serveru požadavek na aktualizaci hesla v databázi. Pokud je požadavek úspěšný, aktualizuje uživatelské rozhraní.

Aktualizujte svou komponentu App.js

Proveďte v souboru src/App.js následující změny:

import { useState, createContext } z"reagovat";
import Přihlásit se z"./components/Login";
import OTPInput z"./components/OTPInput";
import Resetovat z"./components/Reset";
import"./App.css";
vývozníkonst RecoveryContext = createContext();

vývoznívýchozífunkceAplikace() {
konst [page, setPage] = useState("přihlásit se");
konst [e-mail, setEmail] = useState("");
konst [otp, setOTP] = useState("");

funkceNavigateComponents() {
-li (strana "přihlásit se") vrátit se<Přihlásit se />;
-li (strana "otp") vrátit se<OTPInput />;
-li (strana "resetovat") vrátit se<Resetovat />;
}

vrátit se (

"Záhlaví aplikace">
value={{ stránka, setPage, otp, setOTP, email, setEmail }}>


</div>
</RecoveryContext.Provider>
</div>
);
}

Tento kód definuje kontextový objekt, který spravuje stav aplikace, který zahrnuje e-mail uživatele, kód OTP a různé stránky v aplikaci. Objekt kontextu v podstatě umožňuje předávat požadované stavy mezi různými komponentami – alternativa k používání rekvizit.

Obsahuje také funkci, která snadno zvládá navigaci po stránkách, aniž by bylo nutné znovu vykreslovat celé komponenty.

Nastavte server Express.js

S nastavením klienta nakonfigurujte službu back-endového ověřování, aby zvládla funkci resetování hesla.

Začít, vytvořit expresní webový servera nainstalujte tyto balíčky:

npm install cors dotenv nodemailer mongoose

Další, vytvořit databázi MongoDB nebo nakonfigurujte cluster MongoDB v cloudu. Poté zkopírujte poskytnutý připojovací řetězec, vytvořte soubor ENV v kořenovém adresáři a vložte připojovací řetězec.

Chcete-li to dokončit, musíte nakonfigurovat připojení k databázi a definovat datové modely pro vaše uživatelská data. Použijte kód v tomto úložišti k nastavit připojení k databázi a definovat datové modely.

Definujte trasy API

Backendová služba má v ideálním případě několik cest, které zpracovávají požadavky HTTP klientů. V tomto případě budete muset definovat tři trasy, které budou spravovat požadavky API na odesílání e-mailů, ověřování e-mailů a aktualizaci hesla z klienta React.

Vytvořte nový soubor s názvem userRoutes.js v kořenovém adresáři a přidejte následující kód:

konst vyjádřit = vyžadovat('vyjádřit');
konst router = expres. Router();
konst userControllers = vyžadovat('../controllers/userControllers');

router.get('/zkontrolovat email', userControllers.checkEmail);
router.put('/update-password', userControllers.updatePassword);
router.post('/poslat e-mailem', userControllers.sendEmail);

modul.exports = router;

Ovladače pro trasy API

Kontroloři jsou zodpovědní za zpracování požadavků HTTP klientů. Jakmile klient zadá požadavek na určitou trasu API, je vyvolána a spuštěna funkce řadiče, která požadavek zpracuje a vrátí vhodnou odpověď.

Vytvoř nový controllers/userControllers.js soubor a přidejte kód níže.

Použijte kód v tomto úložišti k definovat řadiče pro ověření e-mailu a aktualizaci hesla API trasy.

Začněte definováním ovladače pro odesílání e-mailů:

exports.sendEmail = (req, req) => {
konst transporter = nodemailer.createTransport({
servis: 'gmail',
zajistit: skutečný,
auth: {
uživatel: process.env. MŮJ EMAIL,
pass: process.env. APP_PASSWORD,
},
});

konst { email_příjemce, OTP } = req.body;

konst mailOptions = {
z: process.env. MŮJ EMAIL,
komu: recipient_email,
předmět: 'RESETOVAT HESLO',
html: `


Obnova hesla</h2>

Použití tento OTP pro resetování hesla. Jednorázové heslo je platné pro1 minuta</p>

${OTP}</h3>
</body>
</html>`,
};

transporter.sendMail (mailOptions, (chyba, informace) => {
-li (chyba) {
řídicí panel.log (chyba);
res.status(500).poslat({ zpráva: "Při odesílání e-mailu došlo k chybě" });
} jiný {
řídicí panel.log('Email odeslán: ' + info.odpověď);
res.status(200).poslat({ zpráva: "Email úspěšně odeslán" });
}
});
};

Tento kód definuje funkci, která používá Nodemailer k odeslání e-mailu s resetováním OTP určenému příjemci. Nastaví přepravce pomocí vašeho vlastního účtu Gmail a hesla.

Chcete-li získat heslo aplikace Gmail, musíte vygenerovat heslo aplikace v nastavení účtu Google. Toto heslo pak použijete místo svého běžného hesla k Gmailu pro ověření Nodemaileru.

Nakonfigurujte vstupní bod serveru

Vytvořte soubor server.js v kořenovém adresáři a přidejte tento kód:

konst vyjádřit = vyžadovat('vyjádřit');
konst kors = vyžadovat('cors');
konst app = express();
konst přístav = 5000;
vyžadovat('dotenv').config();
konst nodemailer = vyžadovat('nodemailer');
konst connectDB = vyžadovat('./utils/dbconfig');
connectDB();
app.use (express.json());
app.use (express.urlencoded({ prodloužený: skutečný }));
app.use (cors());
konst userRoutes = vyžadovat('./routes/userRoutes');
app.use('/', userRoutes);

app.listen (port, () => {
řídicí panel.log(`Server poslouchá na http://localhost:${port}`);
});

S nastavením klienta i serveru můžete spustit vývojové servery a otestovat funkčnost hesla.

Vytvoření vlastní služby pro resetování hesla

Vytvoření systému pro resetování hesla jeho přizpůsobením vaší aplikaci a jejím uživatelům je nejlepším přístupem, i když existují placená, předem připravená řešení. Při navrhování této funkce byste měli vzít v úvahu jak uživatelskou zkušenost, tak bezpečnost, protože útoky jsou stálou hrozbou.