使用 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 记住两步走:
module文件添加imports配置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
