نحوه اجرای احراز هویت با nestjs با استفاده از گاردها در 3 مرحله آسان

در حال حاضر بسیاری از شرکتها دیدگاه خود را برای انجام یک اپلیکیشن تغییر دادهاند، فریمورکها و کتابخانههای زیادی بهروز شدهاند، شکل توسعه را تغییر دادهاند و پیادهسازی آنها، راهحلهایی برای پیچیده واقعیت مسئله را انجام دادهاند. امروز، کمی در مورد nestjs می گوییم، این یک فریم ورک پیشرو برای بک اند با جاوا اسکریپت است، که از طریق آن می توان برنامه های مقیاس پذیر را با حالت تمیز و سفارشی ایجاد کرد.
بنابراین، اما، درباره چه موضوعاتی صحبت خواهیم کرد؟ بیایید در مورد Guards در Nestjs صحبت کنیم، ابزاری چند رشتهای که اجازه میدهد هر منطقی را قبل از رسیدن درخواست به کنترلکنندههای ما پیادهسازی کند.
مفاهیم رسمی کلاسی است که با آن مشروح شده است @Injectable() دکوراتور که CanActivate interfaceGuard را پیاده سازی می کند یک مسئولیت دارد. آنها بسته به شرایط خاصی (مانند مجوزها، نقشها، ACLها و غیره) که در زمان اجرا وجود دارند، تعیین میکنند که آیا یک درخواست داده شده توسط هدایتگر مسیر رسیدگی میشود یا خیر. این اغلب به عنوان مجوز نامیده می شود. مجوز (و پسر عموی آن، احراز هویت، که معمولاً با آن همکاری میکند) معمولاً توسط میانافزار در برنامههای سنتی Express اداره میشود. میانافزار انتخاب خوبی برای احراز هویت است، زیرا مواردی مانند اعتبار سنجی توکن و پیوست کردن ویژگیها به شی درخواست به شدت با یک زمینه مسیر خاص (و ابردادههای آن) مرتبط نیستند.
در این وبلاگ در مورد تمام کارهایی که با این عملکرد می توان انجام داد صحبت نکنید، به طور مشخص نگاه کنید که چگونه یک محافظ برای احراز هویت بدون نصب هیچ چیز و به شکل آسان پیاده سازی می کند. بیا بریم
مرحله صفر:
ما باید یک پروژه Nestjs را در رایانه هایمان ایجاد کنیم، برای انجام این کار، بررسی، همچنین مهم است، باید یک ماژول با هر عملکردی ایجاد کنید، در غیر این صورت باید یک ماژول با:
npm g module Foo
و مرحله کامل با بعدی و انجام شد!
گام اول:
اولین کاری که باید انجام دهیم این است که یک محافظ ایجاد کنیم، برای این کار از دستور استفاده می کنیم:
nest generate gu FooGuard
این دستور چیزی شبیه به زیر ایجاد می کند:
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class FooGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
ما به یاد داریم که این گارد یک رابط CanActivate را پیاده سازی می کند، یعنی کسی که تمام منطق گارد ما را مدیریت می کند.
خوب، پس از ایجاد دکوراتور خود، بسیار مهم است، زیرا این امر با تزریق وابستگی، به محافظ ما تماس می گیرد
import { SetMetadata } from '@nestjs/common';
import { FooEnum } from './FooEnum.enum';
export const FooRolesDecorator = (...fooRolesDecorator: FooRolesDecorator[]) =>
SetMetadata('fooRolesDecorator', FooEnum);
**مهم: **ضروری نیست Enum ایجاد کنید، اما توسط nestjs بسیار توصیه می شود، برای بهترین شیوه ها، اطلاعات بیشتر: https://docs.nestjs.com/openapi/types-and-parameters#enums
مرحله دوم:
پس از ایجاد یک فایل نگهبان و دکوراتور آن، به پیاده سازی می رویم، زیرا این بسیار مهم است که شما در مورد درایو تزریق وابستگی دانش داشته باشید. برای اکوسیستم های درایو با تزریق وابسته، nestjs، یک رابط آماده برای استفاده فراهم کنید. ExecutionContext، اساساً این کار را برای توصیف جزئیات مربوط به خط لوله درخواست فعلی و بازگشت دو روش انجام دهید. getClass()، که نوع کلاس کنترلی را که کنترل کننده فعلی به آن تعلق دارد، برمی گرداند getHandler() که مرجعی را به handler (روش) برمیگرداند که در مرحله بعدی فراخوانی میشود
درخواست خط لوله برای اطلاعات بیشتر: https://docs.nestjs.com/guards#execution-context
بنابراین، پس از درک این مفهوم، استفاده از این کلاس، این است که یک پارامتر، که نقش ما خواهد بود.
@Injectable()
export class FooGuard implements CanActivate {
constructor(
private reflector: Reflector,
@Inject('MY_REPO_IN_MODULE')
private myRepoInModule: Repository<MiModel>,
) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const role = this.reflector.getAllAndOverride<
FooRolesDecorator[]
>('fooRolesDecorator ', [context.getHandler(), context.getClass()]);
if (!role ) {
return false;
}
const request = context.switchToHttp().getRequest();
const user = request.headers['user-id'];
if (!user) {
throw new HttpException(
{
status: 403,
error: `Do not have authorization`,
},
403,
);
}
const roleUser = await this.myRepoInModule.findOne({
where: {user_id: user.userId});
if (!reqUser) {
throw new HttpException(
{
status: 403,
error: `Do not have authorization`,
},
403,
);
}
}
return true;
}
}
-
اشاره: بازتابنده helper برای بازیابی متادیتا برای یک کلید مشخص برای یک هدف مشخص استفاده می کند. چند کلمه، داده هایی را دریافت کنید که در دکوراتور ما تنظیم شده است.
-
اشاره: روش، getRequest() برای اجازه دادن، به دست آوردن درخواست شی، از متن.
-
اشاره: گاردها (مخزنها، موجودیتها) را از ماژولهایی که در آنجا فراخوانی شدهاند، بهطور خودکار میگیرند.
مرحله سوم:
در این مرحله آخر، برای پیاده سازی در هر کنترلر (ترجیحا)، در برنامه شما.
@Controller('api/foo')
@UseGuards(FooGuard)
export class RolesController {
constructor(private readonly rolesService: RolesService) {}
@Get()
@FooRolesDecorator(MyEnum.Admin || 'Admin')
create(@Body() createRoleDto: CreateRoleDto) {
return this.rolesService.create(createRoleDto);
}
}
-
اشاره: @UseGuards() دکوراتور که محافظ ها را بسته به زمینه آن به محدوده کنترل کننده یا روش متصل می کند. چه زمانی
@UseGuards
در سطح کنترلکننده استفاده میشود، محافظ برای هر کنترلکننده (روش) در کنترلکننده اعمال میشود. -
اشاره: دکوراتور، @FooRolesDecorator() اجازه می دهد تا از طریق تزریق وابستگی، تنظیم شده بر روی پارامتر، اعتبار مجوز مورد نیاز خود را تأیید کند.
انجام شده!!
نگهبان با لانه 3 مرحله آسان …
فراموش نکنید که در شبکه های اجتماعی من دنبال کنید:
@brngranado در اینستاگرام
@brngranado در توییتر
@GranadoLab در Github
آنجا میبینمت !