跳到主要内容

使用 JWT

JWT(json web token)

添加 nestjs 配置

pnpm i @nestjs/config
// app.modules.ts
import {ConfigModule} from '@nestjs/cofing'

@Module{
imports: [
ConfigModule.forRoot({}),
...
]
}

优化: prisma module 读取 env 属性

// prisma.module.ts
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
import { ConfigModule } from '@nestjs/config';

@Global()
@Module({
  imports: [ConfigModule],
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

// prisma.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient {
  constructor(config: ConfigService) {
    super({
      datasources: {
        db: {
          url: config.get('DATABASE_URL'),
        },
      },
    });
  }
}

接入 JWT

pnpm i @nestjs/passport passport @nestjs/jwt passport-jwt
pnpm i -D @types/passport-jwt
提示

以后添加 module 记住两步走:

  1. module 文件添加 imports 配置
  2. service 文件 constructor 添加参数
// auth.module.ts
import { JwtModule } from '@nestjs/jwt'
@Module{
imports: [JwtModule.register({}), ConfigModule]
...
}
export class AuthModule {}

// auth.service.ts
...
export class AuthService {
  constructor(
    private prisma: PrismaService,
    private config: ConfigService,
) {}
...
}

auth.service.ts 添加 signToken 函数。在需要返回 access_token 的地方调用函数即可。

// auth.service.ts
import ...

@Injectable({})
export class AuthService {
  constructor(
    private prisma: PrismaService,
    private config: ConfigService,
    private jwt: JwtService,
  ) {}
 
  ...
  async signToken(userId: number, email: string) {
    const payload = {
      sub: userId,
      email,
    };

    const secret = this.config.get('JWT_SECRET');
    const token = await this.jwt.signAsync(payload, {
      expiresIn: '15m',
      secret,
    });

    return {
      access_token: token,
    };
  }
}

测试

// API: /auth/signup
{
"email": "test4@protonmail.com",
"password": "test"
}
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjYsImVtYWlsIjoidGVzdDRAcHJvdG9ubWFpbC5jb20iLCJpYXQiOjE3MDI1NDU4MDAsImV4cCI6MTcwMjU0NjcwMH0.AZW9ujfU_W1KT1NvEa4wB0FIacTFzhN-Fzs8ssUyJeY"
}

使用 jwt.io 进行校验,输入 VERIFY SIGNATURE

jwt.io_encoded_token