مدیریت کوکی در ExpressJS برای احراز هویت کاربران

Express.js تا حد زیادی یک فریم ورک NodeJs است که به طور گسترده مورد استفاده قرار می گیرد و اگر با آن آشنایی دارید، احتمالاً مدیریت کوکی ها برای شما مفهوم خیلی دردناکی نیست.
اگرچه موارد استفاده متعددی از کوکی ها وجود دارد. مدیریت جلسه، شخصیسازی و غیره. ما یک برنامه آزمایشی ایجاد خواهیم کرد که اجرای ساده مدیریت کوکی را در برنامههای Express.js شما برای احراز هویت کاربران نشان میدهد.
قبل از ایجاد برنامه آزمایشی خود، اجازه دهید کمی در مورد کوکی ها صحبت کنیم.
پس کوکی های HTTP چیست؟
کوکی های HTTP قطعات کوچکی از داده ها هستند که از یک وب سرور ارسال می شوند و در سمت سرویس گیرنده ذخیره می شوند.
برای تنظیم یک کوکی در سمت مشتری، سرور پاسخی را با هدر Set-Cookie ارسال می کند.
هنگامی که مشتری پیام پاسخ را از سرور حاوی هدر Set-Cookie دریافت می کند، کوکی را در سمت سرویس گیرنده تنظیم می کند.
به طوری که هر درخواست بعدی که از سمت مشتری ارسال می شود به صراحت شامل؛
- فیلد هدر به نام «کوکی»
- یک هدر واقعی که حاوی مقدار است.
- اطلاعات کوکی که توسط سرور در پیام پاسخ ارسال شده است.
در واقع، این برای محدوده مقاله ما کافی است، اما اگر می خواهید در مورد کوکی های مرورگر بیشتر بدانید، خواندن این مقاله را توصیه می کنم.
مرحله 1: راه اندازی برنامه دمو Express ما
برای شروع، باید یک برنامه اکسپرس دمو ایجاد کنیم تا بتوانیم مدیریت کوکی خود را پیاده سازی کنیم. برای ایجاد سریع یکی از ابزار مولد برنامه express، express-generator استفاده می کنم.
برای ایجاد دستور زیر را اجرا کنید
npx express-generator express-cookie
برای نسخه های قبلی Node، مولد برنامه را به عنوان یک بسته جهانی npm نصب کنید و سپس آن را راه اندازی کنید، برای بررسی بیشتر مستندات اکسپرس.
تمام ماژولهای آغازگر و میانافزار ضروری که ما استفاده خواهیم کرد باید با express-generator تولید شده باشند، ساختار پوشه پروژه شما باید مانند زیر باشد.
تمام ماژولهای آغازگر و میانافزار ضروری که ما استفاده خواهیم کرد باید با express-generator تولید شده باشند، ساختار پوشه پروژه شما باید مانند زیر باشد.
مرحله 2: میان افزار احراز هویت اولیه را ایجاد کنید
برای نشان دادن استفاده از کوکی ها برای احراز هویت، نیازی به پیاده سازی یک سیستم احراز هویت کامل نخواهیم داشت.
بنابراین برای سادگی، از احراز هویت اولیه استفاده خواهم کرد. مکانیزم بسیار اساسی که ما را قادر می سازد تا کاربران را احراز هویت کنیم.
احراز هویت اولیه چگونه کار می کند؟
هنگامی که سرور درخواست را دریافت می کند، سرور اطلاعات مجوز را از هدر درخواست مشتری استخراج می کند. و سپس، قبل از اجازه دسترسی به عملیات مختلف در سمت سرور، از آن برای احراز هویت مشتری استفاده کنید.
اگر این درخواست مشتری شامل اطلاعات مجوز نباشد، سرور مشتری را به چالش می کشد، آنها از مشتری می خواهند که این اطلاعات را با فیلدهای نام کاربری و رمز عبور ارسال کند.
بنابراین، هر پیام درخواستی که از یک کلاینت نشات میگیرد باید فرم کدگذاری شده نام کاربری و رمز عبور را در سربرگ درخواست که از مشتری به سمت سرور میرود، داشته باشد.
app.js خود را باز کنید و میان افزار اعتبار ما را با منطق بالا به صورت زیر اضافه کنید:
. . .
function auth (req, res, next) {
//server will extract authorization information from the client's request header
var authHeader = req.headers.authorization;
if (!authHeader) {
var err = new Error('You are not authenticated!');
res.setHeader('WWW-Authenticate', 'Basic');
err.status = 401;
next(err);
return;
}
//If this client request does not include the authorization information
var auth = new Buffer.from(authHeader.split(' ')[1], 'base64').toString().split(':');
var user = auth[0];
var pass = auth[1];
//static credential values
if (user == 'admin' && pass == 'password') {
next(); // user authorized
} else {
var err = new Error('You are not authenticated!');
res.setHeader('WWW-Authenticate', 'Basic');
err.status = 401;
next(err);
}
}
app.use(auth);
. . .
توجه داشته باشید: باید میانافزار auth را در بالای روترها اضافه کنید تا هنگام دریافت درخواست، میانافزار مجوز به درستی راهاندازی شود.
احراز هویت مبتنی بر کوکی
ما می خواهیم فقط کاربران احراز هویت شده به عملیات های مختلف در سمت سرور دسترسی داشته باشند. در اینجا نحوه عملکرد گردش کار مبتنی بر کوکی آمده است.
- اولین باری که کاربر سعی می کند به سرور دسترسی پیدا کند، انتظار داریم که کاربر خودش را مجاز کند.
- پس از آن، ما کوکی را در سمت سرویس گیرنده از سرور تنظیم می کنیم.
- پس از آن، مشتری مجبور نیست به ارسال اطلاعات اولیه احراز هویت ادامه دهد. در عوض، مشتری باید کوکی را در درخواست خروجی قرار دهد.
مرحله 3: تنظیم کوکی در سمت مشتری
Express دارای یک ویژگی کوکی در شی پاسخ است، بنابراین ما نیازی به پیاده سازی هیچ کتابخانه دیگری نداریم، اجازه می دهیم نام کاربری را به عنوان کوکی ارسال کنیم:
// sentUserCookie creates a cookie which expires after one day
const sendUserCookie = (res) => {
// Our token expires after one day
const oneDayToSeconds = 24 * 60 * 60;
res.cookie('user', 'admin', { maxAge: oneDayToSeconds});
};
دریافت کوکی ها در صورت درخواست
ما استفاده خواهیم کرد تجزیه کننده کوکی میان افزار برای رسیدگی به کوکی ها اگر app.js را باز کنید، متوجه خواهید شد که تجزیه کننده کوکی قبلاً در برنامه اکسپرس ما گنجانده شده است، زیرا ما پروژه خود را با اکسپرس ژنراتور.
توجه: اگر نیاز به نصب صریح کوکی تجزیه کننده دارید، دستور نصب به صورت زیر است:
npm install cookie-parser.
Cookie-Parser سرصفحه کوکی را تجزیه می کند و در صورت درخواست پیوست می کند، بنابراین ما می توانیم به کوکی ها با: req.cookie دسترسی داشته باشیم.
برای اطلاعات بیشتر، کد منبع تجزیه کننده کوکی را بررسی کنید.
مرحله 4: مکانیسم احراز هویت با کوکی ها
ما به نحوه دریافت و تنظیم کوکی ها نگاه کردیم، بیایید میان افزار احراز هویت خود را برای ایجاد یک مکانیسم احراز هویت ساده با کوکی ها تغییر دهیم.
function auth (req, res, next) {
//check client has user cookie
if (!req.cookie.user) {
//get authorization
var authHeader = req.headers.authorization;
if (!authHeader) {
var err = new Error('You are not authenticated!');
res.setHeader('WWW-Authenticate', 'Basic');
err.status = 401;
next(err);
return;
}
//If this client request does not include the authorization information
var auth = new Buffer.from(authHeader.split(' ')[1], 'base64').toString().split(':');
var user = auth[0];
var pass = auth[1];
if (user == 'admin' && pass == 'password') {
sendUserCookie(res)
next(); // user authorized
} else {
var err = new Error('You are not authenticated!');
res.setHeader('WWW-Authenticate', 'Basic');
err.status = 401;
next(err);
}
}
else {
//client request has cookie, check is valid
if (req.cookie.user === 'admin') {
next();
}
else {
var err = new Error('You are not authenticated!');
err.status = 401;
next(err);
}
}
}
نتیجه
به طور خلاصه، ما مکانیزمی ایجاد می کنیم که برخی از اطلاعات را در مرورگر برای احراز هویت درخواست می کند. پس از آن، نحوه حفظ این اطلاعات تأیید اعتبار را با استفاده از کوکی ها برای جلوگیری از ارسال مجدد اطلاعات تأیید بررسی می کنیم.
اکنون با گسترش بیشتر، اگر سرور شما بخواهد اطلاعات مربوط به مشتری شما را ردیابی کند، سرور ممکن است به صراحت یک مکانیسم ردیابی جلسه را تنظیم کند. کوکی ها کوچک هستند و نمی توانند اطلاعات زیادی را ذخیره کنند.
حال، اگر میخواهیم اطلاعات بیشتری در مورد یک کلاینت در سمت سرور ردیابی شود، جلسات express ما را قادر میسازد تا این کار را انجام دهیم. اگر سوالی دارید فقط به من پینگ کنید 🙂