用loadAccountController在crazystack node.js验证刷新令牌
#javascript #typescript #node #jwt

带有loadAccountController的刷新代币类将解决我们应用程序安全性的重要功能,即刷新令牌的验证。目前,我们将讨论如何使用LoadAccountController来检查刷新令牌是否徒劳并更新它,以确保我们的用途可以访问应用程序的受保护信息。我们还将看到该控制器对于应用程序其他部分的操作至关重要,例如访问明智的用户信息或会话管理。我们将学会实施此功能并将其与应用程序的其他部分集成以创建一个安全且值得信赖的系统。

这是Devdoid的Bootcamp Crazystack Node.js的辅助材料。他将作为仅作为互补材料在课堂上看到的某些耳朵的文档,保证他在Bootcamp clicando AQUI!中的位置。

import {
  Authentication,
  HttpRequest,
  HttpResponse,
  Validation,
  badRequest,
  forbidden,
  unauthorized,
  addDays,
  ok,
} from "@/application/helpers";
import { Controller } from "@/application/infra/contracts";
import { LoadAccount, AddAccount } from "@/slices/account/useCases";
import { EmailInUseError } from "@/application/errors";

export class LoadAccountController extends Controller {
  constructor(
    private readonly validation: Validation,
    private readonly loadAccount: LoadAccount,
    private readonly addAccount: AddAccount,
    private readonly authentication: Authentication
  ) {
    super();
  }
  async execute(httpRequest: HttpRequest<any>): Promise<HttpResponse<any>> {
    const errors = this.validation.validate(httpRequest?.body);
    if (errors?.length > 0) {
      return badRequest(errors);
    }
    const accountExists = await this.loadAccount({
      fields: {
        userId: httpRequest?.userId,
        refreshToken: httpRequest?.headers?.refreshtoken,
        isFutureexpiresAt: new Date(),
      },
      options: {},
    });
    if (!accountExists) {
      return unauthorized();
    }
    const { accessToken = null, refreshToken = null } =
      (await this.authentication.authRefreshToken(httpRequest?.userId as string)) || {};
    if (!accessToken || !refreshToken) {
      return unauthorized();
    }
    await this.addAccount({
      createdById: httpRequest?.userId as string,
      name: accountExists?.name as string,
      refreshToken,
      active: true,
      expiresAt: addDays(new Date(), 1) as unknown as string,
    });
    return ok({ accessToken, refreshToken });
  }
}

这是旨在验证用户发送的刷新令牌的LoadAccountController类的方式,并在成功的情况下返回新的访问令牌和刷新令牌。

loadAccountController类是一个控制器子类,并通过注入依赖,验证,携带享受的功能,添加用户和身份验证功能的功能接收。

母亲©All Perrivor()会收到HTTP请求,并检查它是否具有使用验证的所有必要字段。如果发生错误,则返回BadRequest。然后,如果用户使用母亲©ALL LOADACCOUNT(),则整体进行验证。如果不存在用户,则将返回未经授权。

接下来,整个调用authentication.authrefreshtoken()函数以生成新的访问令牌和刷新令牌。如果未正确生成令牌,则返回了未授权。最后,整体使用addAccount()函数添加用户,并返回以HTTP响应格式生成的新令牌,该格式使用状态代码200和包含令牌的响应主体返回。

import { makeLogController } from "@/application/decorators/logControllerFactory";
import { makeDbAuthentication, makeValidationComposite } from "@/application/factories";
import { Controller } from "@/application/infra/contracts";
import { makeAddAccountFactory, makeLoadAccountFactory } from "@/slices/account/useCases";
import { LoadAccountController } from "@/slices/account/controllers";

export const makeLoadAccountController = (): Controller => {
  const requiredFields: string[] = [];
  return makeLogController(
    "loadAccount",
    new LoadAccountController(
      makeValidationComposite(requiredFields),
      makeLoadAccountFactory(),
      makeAddAccountFactory(),
      makeDbAuthentication()
    )
  );
};

makeLoadAccountController函数返回使用MakeLogController函数装饰的LoadAccountController类的实例。 LoadAccountController类的建筑商可以接收四个依赖性:

验证:使用makeValidationComposite创建验证复合的实例并传递了强制性字段的空矩阵。

loadAccount:使用makeLoadAccountFactory创建了使用的实例。

addAccount:使用makeadDaccountFactory创建AddAccount的实例。

身份验证:使用makedbauthentication创建身份验证的实例。

此装饰的控制器可用于处理帐户加载请求。从LoadAccountController类中运行的整个运行验证了输入请求,调用CCCOUNT的使用以查看帐户是否存在,如果存在,则调用整个身份验证实现AuthreFreshToken O以获取访问并更新令牌。如果返回令牌,则调用使用addAccount来存储更新的更新令牌。最后,带有访问令牌和更新的JSON响应将返回给客户。

https://github.com/gumiranda/CrazyStackNodeJs/commit/6be37c86b4d3ceac3597d2b45ce37be8c5fd4ad7

LINK DO REPOSITÓRIO