Cvičení – správa životního cyklu požadavku
Společnost Tailwind Traders potřebuje svou aplikaci, aby měla základní zabezpečení. Aplikace Express by měla rozlišovat mezi registrovanými zákazníky, kteří mají přístup, a jinými uživateli, kteří nemají přístup. Další funkce, jako je správa rolí, bude možné přidat později.
Přidání základní autorizace do architektury Expressu
Většina aplikací má části, ke kterým mají přístup všichni. Ale některé části je potřeba chránit. Existují různé způsoby ochrany aplikace. V tomto cvičení implementujete jednoduchý systém ochrany, abyste pochopili, jak mechanismus middlewaru funguje v rozhraní Express.
Vytvoření webového serveru
V tomto cvičení pokračujte v používání vývojového kontejneru. K dispozici je ukázkový projekt, který obsahuje soubory produktů a počáteční kód aplikace. Vyplníte chybějící části projektu a dokončíte aktualizace aplikace pro zákazníka.
Otevřete složku node-essentials/nodejs-http/exercise-express-middleware v terminálu tak, že kliknete pravým tlačítkem na název složky a vyberete Otevřít v integrovaném terminálu.
Tato složka obsahuje tři soubory: app.js, client.js a package.json.
Soubor package.json obsahuje závislost s názvem
express
. Spuštěním následujícího příkazu nainstalujte závislost:npm install
npm
přečte z oddíludependencies
v souboru package.json a nainstaluje požadované balíčky.V editoru kódu otevřete soubor app.js a zkontrolujte jeho obsah:
const express = require("express"); const app = express(); const port = 3000; app.get("/", (req, res) => res.send("Hello World!")); app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); }); app.get("/products", (req, res) => { res.json([ { id: 1, name: "The Bluest Eye", }, ]); }); app.listen(port, () => console.log(`Example app listening on port ${port}!`));
Kód obsahuje funkční aplikaci Express se třemi trasami: lomítko
/
,/users
a/products
.
Vytvoření klientské aplikace
V editoru kódu otevřete soubor client.js aplikace a zkontrolujte jeho obsah:
const http = require('http');
const options = {
port: 3000,
hostname: 'localhost',
path: '/users',
headers: {}
};
const req = http.get(options, (res) => {
console.log(`Connected - Status Code ${res.statusCode}`);
res.on('data', (chunk) => {
console.log("Chunk data: ", chunk.toString());
});
res.on('end', () => {
console.log('No more data');
});
res.on('close', () => {
console.log('Connection closed');
});
});
req.on('error', (error) => {
console.error('An error occurred: ', error);
});
req.end();
Tento kód je jednoduchý klient HTTP, který se připojuje k aplikaci Express. Není to webový prohlížeč. Nevykresluje HTML. Jenom se připojí k serveru a přečte vrácená data. Je to dobrý příklad použití modulu HTTP z Node.js.
Kód klientské aplikace se připojí k adrese http://localhost:3000/users
trasy /users
. Klient naslouchá třem událostem: data
, end
a close
. Při generování události se všechny funkce připojené k této konkrétní události volají synchronně. Tím se zajistí správné sekvencování událostí a pomůže se vyhnout konfliktům časování a chybám logiky. V případě potřeby můžou funkce naslouchacího procesu přepnout do asynchronního režimu operace pomocí setImmediate()
metod nebo process.nextTick()
metod. Toto se v tomto modulu nezabývá.
Spuštění programu Express
Teď jste připraveni vyzkoušet program Express s klientskou aplikací.
V terminálu spusťte program serveru Express zadáním tohoto příkazu:
node app.js
Poznámka:
Ujistěte se, že používáte soubor app.js umístěný na adrese
/nodejs-http/exercise-express-middleware
.Otevřete druhý terminál a spusťte klientskou aplikaci:
node client.js
Ve druhém terminálu by se měl zobrazit následující výstup z klienta:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
Server Express odpoví některými uživatelskými daty.
chunk [{"id":1,"name":"User Userson"}]
Všechny části aplikace fungují.Klientská aplikace skončí po zobrazení výstupu.
V prvním terminálu (server Express) ukončete program stisknutím kombinace kláves Ctrl+C.
Ochrana trasy
Abychom tuto trasu ochránili, přidáme do aplikace Express nějaký kód.
V editoru kódu otevřete soubor /nodejs-http/exercise-express-middleware/app.js .
const app = express()
Vyhledejte příkaz. Za tento příkaz přidejte následující kód:function isAuthorized(req, res, next) { const authHeader = req.headers.authorization; if (!authHeader || authHeader !== 'secretpassword') { return res.status(401).send('Unauthorized: Access Denied'); } next(); }
Dále ve stejném souboru vyhledejte následující část kódu:
app.get("/users", (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Nahraďte tuto část následujícím kódem, aby
isAuthorized
middleware byl druhým argumentem:app.get("/users", isAuthorized, (req, res) => { res.json([ { id: 1, name: "User Userson", }, ]); });
Spuštění programu Express a vyvolání middlewaru
Zkuste klientskou aplikaci znovu s aktualizovaným serverovým programem.
V prvním terminálu spusťte následující příkaz, který restartuje program Express:
node app.js
V druhém terminálu restartujte klientskou aplikaci:
node client.js
Ve druhém terminálu by se měl zobrazit následující výstup:
connected - statusCode: 401 chunk Not permitted No more data Closing connection
Tentokrát se
isAuthorized()
middleware vyvolá a vyhledá hlavičkuauthorization
, která má konkrétní hodnotu. Protože jste v rámci požadavku nezadali konkrétní hodnotu, kód neodpověděl s konkrétními uživatelskými daty. Místo toho bylachunk Not permitted
odpověď . V další části přidáte konkrétní autorizaci.V prvním terminálu program zastavíte stisknutím kombinace kláves Ctrl+C.
Přidání autorizační hlavičky
Potřebujete přidat authorization
záhlaví pro určitou hodnotu.
V editoru kódu znovu otevřete soubor nodejs-http/exercise-express-middleware/client.js . Vyhledejte následující příkaz:
headers: {},
Nahraďte tento příkaz následujícím kódem:
headers: { authorization: 'secretpassword' },
Spuštění programu Express s autorizací klienta
Zkuste klienta znovu s hlavičkou authorization
.
V prvním terminálu spusťte následující příkaz, který restartuje program Express:
node app.js
V druhém terminálu spusťte znovu klienta spuštěním následujícího příkazu:
node client.js
Ve druhém terminálu byste teď měli vidět následující výstup:
connected - statusCode: 200 chunk [{"id":1,"name":"User Userson"}] No more data Closing connection
Uživatelská data se vrátí, protože jste předali hlavičku
authorization
s přijatou hodnotou.V prvním terminálu program zastavíte stisknutím kombinace kláves Ctrl+C.
Blahopřejeme! Naučili jste se, jak pomocí middlewaru v Expressu přidat do programu Express předběžné zpracování, základní autorizaci.
Upozornění
Mějte na paměti, že ověřování/autorizace určené pro skutečné použití musí být robustnější než v tomto příkladu. Je vhodné vyhledat koncepty, jako jsou OAuth, JSON Web Tokens, JWT a kryptografie knihovny, abyste měli jistotu, že vaše aplikace má ochranu před neoprávněnými uživateli.
Vyčištění vývojového kontejneru
Po dokončení projektu můžete chtít vyčistit vývojové prostředí nebo ho vrátit do typického stavu.
Odstraněním prostředí GitHub Codespaces zajistíte, že můžete maximalizovat nárok na počet bezplatných hodin za jádro, které získáte pro svůj účet.
Důležité
Další informace o oprávněních účtu GitHub najdete v tématu GitHub Codespaces měsíčně zahrnuté hodiny úložiště a jádra.
Přihlaste se k řídicímu panelu GitHub Codespaces (https://github.com/codespaces).
Vyhledejte aktuálně spuštěné Codespaces zdrojové z
MicrosoftDocs/node-essentials
úložiště GitHub.Otevřete místní nabídku pro codespace a vyberte Odstranit.