Çerezlerle Hatırlama
Coddy'nin Node.js Journey'sinin Kimlik Doğrulama ve Güvenlik bölümünün bir parçası. Ders 8 / 24.
HTTP, istekler arasında sizi unutur: her istek tek başına gelir ve sunucu bunun aynı tarayıcıdan geldiğini anlayamaz. Çerez bunu çözer. Sunucu bir Set-Cookie başlığıyla yanıt verir ve tarayıcı, bu siteye yaptığı sonraki her istekte değeri bir Cookie başlığıyla geri gönderir.
res.cookie(name, value) bir çerez ayarlar. req.get('cookie'), tarayıcının gönderdiği Cookie başlığını tek satırlık metin olarak okur. Express, Cookie başlığını sizin için okumaz (bunu cookie-parser paketi yapardı), bu yüzden cookies.js size parseCookies işlevini sunar. Her değer metin olarak gelir.
app.get('/theme/:name', (req, res) => {
res.cookie('theme', req.params.name);
res.send('Saved');
});
app.get('/', (req, res) => {
const { theme = 'light' } = parseCookies(req.get('cookie'));
res.send(`Your theme is ${theme}`);
});Görev
KolayGET /visit, bu tarayıcının bu uç noktaya kaç kez istek gönderdiğini saymalıdır. Sunucu sayıyı kaydetmez. Sayı bir çerezde taşınır ve tarayıcı her istekte bunu geri gönderir.
server.jsdosyasında,GET /visitiçinde, derste gösterildiği gibiparseCookieskullanarak tarayıcının gönderdiği çerezleri okuyun. Sayı,visitsadlı çerezde bulunur."2"gibi metin olarak gelir. İlk ziyarette bu çerez yoktur; bu durumda sayı 0 kabul edilir.- Sayıya 1 ekleyin; böylece
"2","21"değil,3olur. visitsçerezini yeni sayıya ayarlayın; böylece tarayıcı bir sonraki seferde bunu geri gönderir.- Yeni sayıyı metin olarak değil, sayı olarak yanıtlayın:
{"visits": 3}.
Deneyin: “Oyna” düğmesine basın. GET /visit isteğini gönderin: {"visits": 1}. İsteği tekrar gönderin: {"visits": 2}. Üçüncü kez gönderin: {"visits": 3}. Bu yanıtın Headers sekmesini açın: Set-Cookie, visits=3; Path=/ değerini gösterir.
Kendin dene
import express from 'express';
import { parseCookies } from './cookies.js';
import { notes, users } from './db.js';
import { hashPassword, verifyPassword } from './passwords.js';
const app = express();
app.use(express.json());
app.post('/signup', async (req, res) => {
const username = String(req.body.username ?? '').trim().toLowerCase();
const password = String(req.body.password ?? '');
if (!username || password.length < 8) {
return res.status(400).json({ error: 'Pick a username and a password of at least 8 characters' });
}
if (await users.findOne({ username })) {
return res.status(409).json({ error: 'That username is taken' });
}
await users.insertOne({ username, passwordHash: await hashPassword(password) });
res.status(201).json({ username });
});
app.post('/login', async (req, res) => {
const username = String(req.body.username ?? '').trim().toLowerCase();
const user = await users.findOne({ username });
if (!user || !(await verifyPassword(String(req.body.password ?? ''), user.passwordHash))) {
return res.status(401).json({ error: 'Wrong username or password' });
}
res.json({ username: user.username });
});
// Bu tarayıcının GET /visit isteğini kaç kez yaptığını sayar.
app.get('/visit', (req, res) => {
const visits = 1;
res.json({ visits });
});
// Notlar. Şimdilik herkes bunları okuyabilir ve yazabilir.
app.get('/notes', async (req, res) => {
res.json(await notes.find().toArray());
});
app.post('/notes', async (req, res) => {
const note = { text: String(req.body.text ?? '') };
await notes.insertOne(note);
res.status(201).json(note);
});
app.listen(3000, () => {
console.log('Vault is running on port 3000');
});
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Kimlik Doğrulama ve Güvenlik bölümündeki tüm dersler
Kendi başına pratik yap: Express playground