NTENJSにおける自己責任


再開する


vamos a c c o mo figalar la autenticaci en n n her er tener un token jwt v . do lido en el access o nuestrosは,m ̄s感受性を端点とする.

エンノノ

  • 32のGBのRAM i 7を予約してください
  • Slimbookos ( Ubuntu 20.04 )
  • NESTJS 7.0.0
  • ビジュアルスタジオコード
  • イントロダクション


    ラヴェルにおける契約の成立に関する一考察
    デヘチョAquaは、Vcomos ver como enviar el id del usuario aトラベルesデトークン、アルゴMucho M ' s sセグクロque hacerlo por parメトロメトロen la URL.Imaginadは、終点のque devevelve datosの司法、y que simplemente cambiando el id por parはメトロy volviendo hacer la llamada、devuelve los datosの司法、queのアメアメ員tienen que serのconddenciales、de cualquierのpersonconque que connes de nada、pues eso ha pasado.

    vamos al l l o o


    En Nodejs se sueleの利用者のパスポートによってLaのコンフィギュレーションを行います.
    $> npm install --save @nestjs/passport passport @nestjs/jwt passport-jwt bcrypt
    $> npm install --save-dev @types/passport-jwt @types/bcrypt
    
    アデールのパスポートTambiは、パスポートTambiによって、La Crypfencia de bcrypt que nos vaのpermitir codificar la password en baseデdatos、パラクNandie、incluso Personas con permisosパラシュートで降下します.
    FicHero SRC/User/UserにおけるチュートリアルTenemos Ya en Nuestro proyectoについてエンティティ.TS queは、nuestra entiddeデusuariarle y vamos a asociarle la password que usaremos para comproar la entidad de la persona en el proceso de loginを定義します.
    Por Ero Ellesitamos a adiadia la columna password , y dos m tertodos : Uno que se va a ejcarutar antes del insert de la entidad y que se va a encargar de codificar la password y otro que usaremos postoormente para validar que la password del usuario al hacer login es v len lida , gracias a la librer is bcrypt
    La Entidadユーザー実体Quearは、デesta formaを起こしました:
    import * as bcrypt from 'bcrypt';
    import { BeforeInsert, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
    
    @Entity('users')
    export class UserEntity {
      @PrimaryGeneratedColumn('uuid')
      readonly userId: string;
    
      @Column({
        unique: true,
      })
      readonly name: string;
    
      @Column({ type: 'varchar', length: 70, nullable: true })
      password: string;
    
      @BeforeInsert()
      async hashPassword() {
        const salt = await bcrypt.genSalt();
        this.password = await bcrypt.hash(this.password, salt);
      }
    
      async validatePassword(password: string): Promise<boolean> {
        return await bcrypt.compareSync(password, this.password);
      }
    
      constructor(userId: string, name: string, pass: string) {
        this.userId = userId;
        this.name = name;
        this.password = pass;
      }
    }
    
    Unicode Fichero de Migraci - en - Ejecutando El ComandoにおけるEsches Es Momento de Esches Es Momento deとして
    $> npm run typeorm:migrate add-auth
    
    Ahora Vamos al Servicioユーザリポジトリパラシュート.
    getUserByName(name: string): Promise<UserEntity> {
        return this.usersRepository.findOne({ name });
    }
    
    エステmは、todo VAをSEA Invocado Por La CapaデServicio、Por Lo que dentro del servicioユーザーサービスvamos a a ar unuo mを含みます.
    async getUserByName(name: string): Promise<UserEntity> {
        return await this.usersRepository.getUserByName(name);
    }
    
    エステes un buen momento para verque to que tomiges i n n se aplica rectamente y que todos nuestrosはsigeen pasandoをテストします.
    $> npm run verify
    
    TedRemoks que ver que todo sigue siendo是正、Aunque Ahora tenemos la cobertura un poco m ' sバヤal tener nuevo c deo digo que no ha sido todavは、プローダです.
    Nuo Vez Tenemos Todo Lo Dimenias Parp Guardar Las Credenciales de Nuestros Usualia , El - Momento de crear un Nuevo M Dance Dulo Lamado "Auth "
    $> npx nest generate module auth
    
    デトロイトデルNuevo mは、Dulo Vamos Aを作ります.サービス、エルCual VAの実装のDOS mを使用して:UNO“ValidateUser”que se va encargar de validar las credenciales del usuario、es decir、que el user name exists a base data datos y que su password偶然コンステエルリビドーエヌエルエルポイントポイントログイン.P . O . M . A . A . A . A . A . A . A . C .についてN ' s Melos de Cuenta、Contrase - Trip - asなど
    import { Injectable } from '@nestjs/common';
    import { JwtService } from '@nestjs/jwt';
    import { UsersService } from 'src/users/users.service';
    import { JWTPayload } from './jwt.payload';
    
    @Injectable()
    export class AuthService {
      constructor(
        private usersService: UsersService,
        private jwtService: JwtService
      ) {}
    
      async validateUser(username: string, pass: string): Promise<boolean> {
        const user = await this.usersService.getUserByName(username);
        return await user.validatePassword(pass);
      }
    
      async generateAccessToken(name: string) {
        const user = await this.usersService.getUserByName(name);
        const payload: JWTPayload = { userId: user.userId };
        return {
          access_token: this.jwtService.sign(payload),
        };
      }
    }
    
    Cuada Traejasは、タイプ・ブエナPR Cal Claar Interface/Claase que GuardenエルTipadoデLos Oobjetos que Utilizamosをタイプします.エヌCoco、Vamosは、クリアーエルFichero Auth/JWTです.ペイロードコンテニート集
    export interface JWTPayload {
      userId: string;
    }
    
    Igual Creamos Nuna Clase(パラポンダーHacer USOデLas anotaciones de swagger para la Documentaci des n del del)
    import { ApiProperty } from '@nestjs/swagger';
    
    export class LoginDTO {
      @ApiProperty()
      name: string;
    
      @ApiProperty()
      pass: string;
    }
    
    <研究ノート> Le - Le - Usualia ( Auth/Auth . Controller . TS )におけるRichard de Los Usualia ( Auth/Auth . Controller . TS )の妥当性について
    import { Body, Controller, Post, UnauthorizedException } from '@nestjs/common';
    import { AuthService } from './auth.service';
    import { LoginDTO } from './login.dto';
    
    @Controller('login')
    export class AuthController {
      constructor(private authService: AuthService) {}
    
      @Post()
      async login(@Body() loginDTO: LoginDTO): Promise<{ access_token: string }> {
        const { name, pass } = loginDTO;
        const valid = await this.authService.validateUser(name, pass);
        if (!valid) {
          throw new UnauthorizedException();
        }
        return await this.authService.generateAccessToken(name);
      }
    }
    
    パラポンダーhacer USOデルServicio JWTServiceパラGenerator Los Tokens de JWT、Tenemos que Import El m Lego Dulo de AuthModule y Eastlecer el Perifedo de expiracienv como変数デentorno、yラcargamos輸入品エルmは、dulo設定モジュールを動かします.ADEMは、Tenemos que registrar comoプロバイダーtodosロスServicicios実装、quedandoエルc -デdigoデesta forma:
    import { Module } from '@nestjs/common';
    import { ConfigModule } from '@nestjs/config';
    import { JwtModule } from '@nestjs/jwt';
    import { UsersModule } from 'src/users/users.module';
    import { AuthController } from './auth.controller';
    import { AuthService } from './auth.service';
    
    @Module({
      imports: [
        ConfigModule.forRoot(),
        UsersModule,
        JwtModule.register({
          secret: process.env.JWT_SECRET,
          signOptions: { expiresIn: '60s' },
        }),
      ],
      controllers: [AuthController],
      providers: [AuthService],
      exports: [AuthService],
    })
    export class AuthModule {}
    
    詐欺Esto Ya Tenemos Un終点que NOS Otorga Tokensは、ロスUsualiusv - Le - Ledos、donde almacenamos su id para evitar tener que pasarlo por URLです.Recurerda queエルトークンESTは、Pasadado Ser操作をします.
    Ahora EntramosエヌラSegundaは、デルOhjetivo que Es Proteger Ciertos端点que queソロPuedan Ser Ejecutados si EL Cliente Tiene UnトークンJWT v - Leリドを結びつけます.
    Paro Epoパスポートは、Donde Neデlas Mとして、Dutintas eStratgeを定義します.CreamosエルFichero Auth/JWT.戦略コンテニート集
    import { Injectable, UnauthorizedException } from '@nestjs/common';
    import { PassportStrategy } from '@nestjs/passport';
    import { ExtractJwt, Strategy } from 'passport-jwt';
    import { UserDTO } from 'src/users/user.dto';
    import { UsersService } from 'src/users/users.service';
    import { JWTPayload } from './jwt.payload';
    
    @Injectable()
    export class JwtStrategy extends PassportStrategy(Strategy) {
      constructor(private usersService: UsersService) {
        super({
          jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
          ignoreExpiration: false,
          secretOrKey: process.env.JWT_SECRET,
        });
      }
    
      async validate(payload: JWTPayload): Promise<UserDTO> {
        const user = await this.usersService.getUserById(payload.userId);
        if (!user) {
          throw new UnauthorizedException();
        }
        return user;
      }
    }
    
    エヌエフficheroは、コスモス、Por un lado que elトークンse va a recibirにトラベルのデラcabeceraデhttp llamada認可、que no vamos a disparar una例外的なn n cuando el token est } expirado y stestlecemos va misma変数de entorno para el secreto
    ADDMは、sの実装を実行します.
    パラ登録者エスタeStratgia Tenemos que Importar el m ' d dulo passportmodule y ELプロバイダーJWTストラテジーen auth.モジュールです.TS
    import { Module } from '@nestjs/common';
    import { ConfigModule } from '@nestjs/config';
    import { JwtModule } from '@nestjs/jwt';
    import { PassportModule } from '@nestjs/passport';
    import { UsersModule } from './../users/users.module';
    import { AuthController } from './auth.controller';
    import { AuthService } from './auth.service';
    import { JwtStrategy } from './jwt.strategy';
    
    @Module({
      imports: [
        ConfigModule.forRoot(),
        UsersModule,
        PassportModule,
        JwtModule.register({
          secret: process.env.JWT_SECRET,
          signOptions: { expiresIn: '60d' },
        }),
      ],
      controllers: [AuthController],
      providers: [AuthService, JwtStrategy],
      exports: [AuthService],
    })
    export class AuthModule {}
    
    エンド・ポイントにおけるエッセンシャル・ラテンアメリカの修道会
    En Nustro Coco de Ejploo del Crud de Usualia , Vamos a a a a a a a a e e a e e a a e e a a e e a a e e a a e e a a e e a a e e a a e e a a e e a e e a e e n e a e d e d e d a d e d e d a d e d a d e d e d a d e d e d a d e d e d a d e d a d e d e d e d e d e d e d e d e d e e a d e d a d e d e d e e a d e d d e d e e a d e d e d e
    import {
      Body,
      Controller,
      Delete,
      Get,
      Param,
      Post,
      Put,
      UseGuards,
    } from '@nestjs/common';
    import { AuthGuard } from '@nestjs/passport';
    import { ApiBearerAuth } from '@nestjs/swagger';
    import { ValidUserIdPipe } from './../pipes/valid-user-id.pipe';
    import { UserDTO } from './user.dto';
    import { UsersService } from './users.service';
    
    @Controller('users')
    export class UsersController {
      constructor(private usersService: UsersService) {}
    
      @Get()
      async getAllUsers(): Promise<UserDTO[]> {
        return await this.usersService.getAllUsers();
      }
    
      @Get(':id')
      @ApiBearerAuth()
      @UseGuards(AuthGuard('jwt'))
      async getUserById(@Param('id') id: string): Promise<UserDTO> {
        return await this.usersService.getUserById(id);
      }
    
      @Post()
      async newUser(@Body() user: UserDTO): Promise<UserDTO> {
        return await this.usersService.newUser(user);
      }
    
      @Put(':id')
      @ApiBearerAuth()
      @UseGuards(AuthGuard('jwt'))
      async updateUser(
        @Param('id', ValidUserIdPipe) id: string,
        @Body() user: UserDTO
      ): Promise<UserDTO> {
        return await this.usersService.updateUser(id, user);
      }
    
      @UseGuards(AuthGuard('jwt'))
      @ApiBearerAuth()
      @Delete(':id')
      async deleteUser(@Param('id') id: string): Promise<void> {
        return await this.usersService.deleteUser(id);
      }
    }
    
    デesta formaロスエンドポイントは、Pueen Ejecutar Cuando息子Llamados Conn国連トークンV法王リドーをseします.Ahora Vamosは、Rectperar Los Datos Por id Tengamos que PasarエルID Par parメトロメトロ、Recuper修道女Ndoloデルトークンのevitar que en enエルエンドポイントです.パラオLo en en vez de recuperarlo de la URL aco de la request donde el m to todo validate del jwtストラテジーha dejado los datos devueltos en una na propiedad que podemos sulttar llamada "user "
    エステ・フォームにおけるクェーダルの形式的形式
    @Get('/me')
    @ApiBearerAuth()
    @UseGuards(AuthGuard('jwt'))
    async getUserById(@Request() req: any): Promise<UserDTO> {
      const { id } = req.user;
      return await this.usersService.getUserById(id);
    }
    
    <研究ノート>オースデジャ・プロイノ・エヌ・ネストスの諸問題についてクレモロスエルFichero "auth/auth .デコレータts ts "コン
    import {
      createParamDecorator,
      ExecutionContext,
      ForbiddenException,
    } from '@nestjs/common';
    import { JWTPayload } from './jwt.payload';
    
    export const Auth = createParamDecorator(
      (data: unknown, ctx: ExecutionContext): Partial<JWTPayload> => {
        try {
          const request = ctx.switchToHttp().getRequest();
          return request.user;
        } catch (error) {
          throw new ForbiddenException();
        }
      }
    );
    
    フランス語から見たスペイン語教育の現状と課題エステSerは、El Ejpraoパラシュートで降下するエルエルCocoデDevolver Uu Usuarioです.
    @Get('/me')
    @ApiBearerAuth()
    @UseGuards(AuthGuard('jwt'))
    async getUserById(@Auth() { id }: UserDTO): Promise<UserDTO> {
        return await this.usersService.getUserById(id);
    }
    
    アホア・ノスの詩学に関する一考察