JWT
安装
bash
pnpm i -S @nestjs/jwt passport-jwt @types/passport-jwt
全局配置
- app.module.ts
ts
import { Module } from "@nestjs/common";
import { LoginModule } from "./Login/login.module";
// 引入JWT模块
import { JwtModule } from "@nestjs/jwt";
// 加载全局异常
import { GlobalExceptionFilter } from "./Global/filter/global.filter";
// 类型
import { APP_FILTER } from "@nestjs/core";
@Module({
imports: [
LoginModule,
// JWT
JwtModule.register({
global: true,
secret: "jsopy",
signOptions: { expiresIn: "3h" },
}),
],
controllers: [],
providers: [
{
provide: APP_FILTER,
useClass: GlobalExceptionFilter,
},
],
})
export class AppModule {}
service 层
ts
import { HttpException, Inject, Injectable } from "@nestjs/common";
import { JwtService } from "@nestjs/jwt";
@Injectable()
export class LoginService {
@Inject()
private readonly jwtService: JwtService;
async getone() {
return "获取第一个";
}
// 生成token
async setToken(userInfo: any): Promise<string> {
// 这里不能写用户密码,怕破译
const payload = {
sub: userInfo.id, // sub 就是用户名称
username: userInfo.username, // username 就是用户姓名
};
// 生成token
return this.jwtService.sign(payload);
}
// 解析token
async verifyToken(token: string): Promise<any> {
try {
return await this.jwtService.verify(token, { secret: "jsopy" });
} catch (e) {
return e;
}
}
}
controller 层
ts
import {
Body,
Controller,
Delete,
Get,
HttpException,
Inject,
Param,
Patch,
Post,
Query,
} from "@nestjs/common";
import { LoginService } from "../services/login.service";
@Controller("logins")
export class LoginController {
@Inject()
private readonly loginService: LoginService;
constructor() {}
@Get("test")
getLogins() {
return this.loginService.getone();
}
@Get("settoken")
async settoken(@Query() query: any) {
return await this.loginService.setToken(query);
}
@Get("gettoken")
async gettoken(@Query() query: any) {
const result = await this.loginService.verifyToken(query.token);
// 判断token是否过期
if (result.name == "TokenExpiredError") {
return "Token过期了";
} else if (result.name == "JsonWebTokenError") {
return "错误token";
} else {
return result;
}
}
}