如何使用Swagger在NestJs中验证登录用户

wooyq4lh  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(157)

我刚开始在一个项目中使用nestjs。我已成功登录用户并返回令牌。现在使用令牌来授权用户是一个问题。尝试获取所有用户一直返回**“未授权访问”**
我也在想我没有把代币放对。在swagger授权UI中,我在输入框中提供了Bearer someTokenGoesHere
下图

这是我的代码main.ts中的Swagger配置

const options = new DocumentBuilder().addBearerAuth()
    .setTitle('My app')
    .setDescription('My app API description')
    .setVersion('1.0')
    .addTag('Tags')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('', app, document);

字符串
用户控制器

import { Controller, Post, Body, Get, Param, UseGuards } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './create-user.dto';
import { LoginUserDto } from './login-user.dto';
import { AuthService } from 'src/auth/auth.service';
import { AuthGuard } from '@nestjs/passport';
import { AdminGuard } from 'src/guards/admin.guard';
import { ApiBearerAuth, ApiBasicAuth } from '@nestjs/swagger';

@Controller('user')
export class UserController {
    constructor(private userService: UserService,
        private authService: AuthService) { }

    @Post('login')
    async login(@Body() loginDTO: LoginUserDto) {
        const user = await this.userService.login(loginDTO);

        const newob = {
            id: user._id
        }

        const payload = {
            userId: user._id,
            email: user.Email,
        }

        const token = await this.authService.signPayLoad(payload);
        return { newob, token };
    }

    @Post('register')
    async register(@Body() createDTO: CreateUserDto) {
        const user = await this.userService.register(createDTO);
        const newob = {
            id: user._id
        }
        const payload = {
            firstname: user.FirstName,
            lastname: user.LastName
        };
        const token = await this.authService.signPayLoad(payload);
        return newob;
    }

    @Get('all')
    @ApiBearerAuth()
    @UseGuards(AuthGuard('jwt'))
    async getAllUsers() {
        return await this.userService.getAllUsers();

    }

    @Post('confirm/:token')
    async confirmEmail(@Param() token: string) {
        const user = await this.userService.ConfirmEmail(token);
        return user;
    }

}


有人能帮帮我吗谢谢

atmip9wb

atmip9wb1#

这些设置对我有效:
main.ts

const config = new DocumentBuilder()
    .setTitle('Nestjs Auth')
    .setDescription('Portfolio 1')
    .setVersion('1.0')
    .addBearerAuth(
      {
        type: 'http',
        scheme: 'bearer',
        bearerFormat: 'JWT',
      },
      'access-token',
    )
    .build();

const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api', app, document, {
    swaggerOptions: {
        persistAuthorization: true, // this
    }});

字符串

user.controller.ts

import { Controller, Get, Post, Body, SetMetadata, UseGuards, Req } from '@nestjs/common';
import { UserService } from './users.service';
import { AuthGuard } from 'src/auth/auth.guard';
import { ApiBearerAuth, ApiBody, ApiHeader } from '@nestjs/swagger';

export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UserService) {}
  
  @Get('/getUsers')
  @UseGuards(AuthGuard)
  @ApiBearerAuth('access-token')
  async getUsers(){
    return this.usersService.getusers();
  }
}


@ApiBearerAuth('access-token')中的密钥应与main.ts中提供的密钥匹配

7vux5j2d

7vux5j2d2#

我已经修好了,谢谢你的建议。我提取的邮件不在有效载荷中。所以我决定记录它,发现它是空的。然后我注销payload,我发现我正在将User Id传递到payload中。所以我改了ID。
结果是

async findByPayLoad(payload: any) {
        const { userId } = payload;
        return await this.userModel.findById(userId)

    }

字符串

相关问题