امنیت API REST براساس نشست ها

احراز هویت (Authentication) یک جنبه حیاتی در هر وبسایت است. این امر اطمینان حاصل می کند که فقط کاربران مجاز به منابع خاص یا انجام اقدامات مشخص دسترسی داشته باشند. در مفالات قبلی در مورد نحوه احراز هویت ‌REST API ها با JWT و همچنین نحوه ذخیره اطلاعات احراز هویت در cookie از سرور Node و express را صحبت کردیم و در این مقاله، نحوه پیاده سازی احراز هویت مبتنی بر سشن با استفاده از Node.js و فریمورک Express را بررسی خواهیم کرد.

احراز هویت مبتنی بر سشن شامل ایجاد یک سشن برای هر کاربر تأیید شده برای ذخیره موقت اطلاعات آنها است. به این سشن یک شناسه منحصر به فرد اختصاص داده می شود که به عنوان شناسه سشن شناخته می شود و سپس در مرورگر کاربر به عنوان کوکی (cookie) ذخیره می شود. سرور می تواند این شناسه سشن را از هر درخواست کاربر بازیابی کند و از آن برای شناسایی و احراز هویت کاربر استفاده کند.

برای شروع، مطمئن شوید که Node.js و Express روی رایانه توسعه شما نصب شده اند. ویرایشگر کد مورد علاقه خود را باز کرده و یک پوشه جدید برای پروژه خود ایجاد کنید. برای راه اندازی یک پروژه جدید Node.js به پوشه پروژه در ترمینال بروید و دستور زیر را اجرا کنید:


npm init -y

در مرحله بعد، وابستگی های مورد نیاز برای پروژه خود را نصب کنید:

npm install express express-session


حالا ما آماده ایم تا سیستم احراز هویت خود را بسازیم. یک فایل جدید به نام app.js ایجاد کنید و آن را در ویرایشگر کد خود باز کنید. با نیازمندی های لازم و پیکربندی Express شروع کنید:

const express = require('express');
const session = require('express-session');

const app = express();

app.use(session({
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: true
}));

app.use(express.urlencoded({ extended: true }));
app.use(express.json());   


در کد بالا، کتابخانه های express و express-session را فراخوانی می کنیم و یک نمونه از برنامه Express ایجاد می کنیم. سپس واسطه (middleware) session را پیکربندی کرده و آن را با یک کلید مخفی (secret key) مقداردهی اولیه می کنیم. این کلید مخفی باید یک رشته تصادفی باشد که برای امضای کوکی سشن استفاده می شود.

در مرحله بعد، مسیر ورود (login) را پیاده سازی خواهیم کرد. کد زیر را بعد از بخش قبلی اضافه کنید:


app.post('/login', (req, res) => {
  const { username, password } = req.body;

  // با منطق احراز هویت خود جایگزین کنید
  if (username === 'admin' && password === 'password') {
    req.session.userId = 'unique-id';
    res.send('با موفقیت وارد شدید!');
  } else {
    res.status(401).send('اطلاعات ورود نامعتبر است!');
  }
});


در این قطعه کد، یک مسیر POST به نام /login تعریف می کنیم که درخواست ورود را مدیریت می کند. ما username و password را از بدنه درخواست استخراج می کنیم و سپس منطق احراز هویت لازم را انجام می دهیم. اگر اعتبارنامه ها معتبر باشند، یک شناسه منحصر به فرد (مانند شناسه کاربر) را در شیء سشن ذخیره می کنیم و یک پیام موفقیت ارسال می کنیم. در غیر این صورت، پاسخی با کد وضعیت 401 Unauthorized ارسال می کنیم.

برای تست سیستم احراز هویت خود، بیایید یک مسیر محافظت شده ایجاد کنیم که به احراز هویت نیاز داشته باشد. کد زیر را به app.js اضافه کنید:


app.get('/profile', (req, res) => {
  // بررسی کنید که آیا کاربر احراز هویت شده است
  if (req.session.userId) {
    res.send('شما احراز هویت شده اید!');
  } else {
    res.status(401).send('ابتدا باید وارد شوید!');
  }
});


مسیر /profile بررسی می کند که آیا خاصیت userId در شیء سشن وجود دارد. در صورت وجود، کاربر احراز هویت شده تلقی می شود و ما پاسخی را ارسال می کنیم که این موضوع را نشان دهد. در غیر این صورت، یک پاسخ 401 Unauthorized ارسال می کنیم که نشان می دهد کاربر ابتدا باید وارد شود.