身份验证

身份验证是大多数应用程序的重要组成部分。有许多不同的方法和策略来处理身份验证。任何项目采用的方法取决于其特定的应用要求。本章介绍了几种可适应各种不同要求的身份验证方法。

JWT 介绍在新窗口打开

安装

安装Zerone 提供的一个auth 身份验证包,其中包括jwt策略和local策略。

yarn add @zeronejs/auth
1

启用

将AuthModule导入根模块。

提示

AuthModule.forRoot传入一个配置对象。在这里在新窗口打开查看可用配置选项的详细信息。

import { AuthModule } from '@zeronejs/auth';
@Module({
    imports: [
        AuthModule.forRoot({
            secret: 'secretKey', // 秘钥
            signOptions: { expiresIn: '6h' }, // 过期时间
        }),
        // ... 其他模块
    ]
})
export class AppModule {}
1
2
3
4
5
6
7
8
9
10
11

警告

不要公开暴露这个密钥。我们在这里这样做是为了向您明确代码在做什么,但在生产环境中,您必须使用适当的措施来保护此密钥, 例如秘钥库、环境变量或配置服务。

默认情况下 jwt策略会全局开启,如果接口需要跳过jwt验证,请使用装饰器 @SkipJwtAuth

    @SkipJwtAuth()
    @Post('auth/register')
    async register(@Body() createUserDto: UserCreateDto) 
1
2
3

示例

通常情况下,您可以使用此模块实现 登录 注册

import { UseGuards } from '@nestjs/common';
import { SkipJwtAuth, AuthService, LocalAuthGuard, Request, encryptedUserPassword } from '@zeronejs/auth';

class AppController {
    constructor(
        private readonly userService: UserService,
        private readonly authService: AuthService
    ) {}
    
    @SkipJwtAuth()
    @Post('auth/register')
    async register(@Body() createUserDto: UserCreateDto) {
        const user = await this.userService.create({
            ...createUserDto,
            password: await encryptedUserPassword(createUserDto.password),
        });
        return this.authService.login(user);
    }

    @SkipJwtAuth()
    @UseGuards(LocalAuthGuard)
    @Post('auth/login')
    async login(@Req() req: Request) {
        return this.authService.login(req.user);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

提示

调用login接口时(或者说是当您使用LocalAuthGuard),您需要提供usernamepasswrod字段