Skip to content

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;
    }
  }
}