Menu
CoddyTech

Ç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}`);
});
challenge icon

Görev

Kolay

GET /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.

  1. server.js dosyasında, GET /visit içinde, derste gösterildiği gibi parseCookies kullanarak tarayıcının gönderdiği çerezleri okuyun. Sayı, visits adlı çerezde bulunur. "2" gibi metin olarak gelir. İlk ziyarette bu çerez yoktur; bu durumda sayı 0 kabul edilir.
  2. Sayıya 1 ekleyin; böylece "2", "21" değil, 3 olur.
  3. visits çerezini yeni sayıya ayarlayın; böylece tarayıcı bir sonraki seferde bunu geri gönderir.
  4. 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');
});
quiz iconKendini test et

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